Xmake配置求助:如何防止依赖库被嵌入自有共享库及二进制程序
Xmake配置求助:如何防止依赖库被嵌入自有共享库及二进制程序
各位Xmake大佬好,我最近刚接触Xmake,折腾了快30小时(还找了ChatGPT和谷歌AI帮忙),还是卡在依赖动态链接的问题上,实在有点头大,想请大家帮我看看怎么解决!
问题背景与核心需求
我正在开发一个叫glymmer的共享库,它依赖raylib和sqlite3,同时还有一个demo二进制程序需要使用这个库。因为LGPL协议的限制,我必须保持所有依赖为独立动态库,绝对不能静态嵌入:
- 目标1:
glymmer作为独立共享库,仅做动态链接,不嵌入raylib和sqlite3的代码 - 目标2:demo程序需要同时动态链接
glymmer、raylib、sqlite3这三个独立的动态库文件 - 当前问题:依赖库被意外嵌入到了
glymmer或demo程序中,不仅违反协议,还会导致多库依赖时出现重复的raylib副本
当前的Xmake配置(简化版)
我怀疑问题出在add_packages()的使用逻辑上,但刚接触Xmake实在摸不清门道。以下是我当前简化后的xmake.lua配置:
-- Created with the help of ChatGPT. includes("xmake/toolchains/**") local VERSION = "0.4" -- Project set_project("glymmer") set_version(VERSION) -- ============================================================ -- Global project settings -- ============================================================ set_languages("c99") add_rules("mode.debug", "mode.release") set_warnings("all") set_optimize("faster") -- ============================================================ -- Dependencies setup -- ============================================================ if is_plat("linux") then -- Linux: use system packages via pkg-config add_requires("pkgconfig::raylib", {system = true}) add_requires("pkgconfig::sqlite3", {system = true}) add_requires("pkgconfig::cunit", {system = true}) -- fallback if pkgconfig not found. if not has_package("pkgconfig::raylib") then add_requires("raylib 5.0") end -- Allows binary files to look in current folder for library dependencies add_ldflags("-Wl,-rpath,'$ORIGIN'") elseif is_plat("windows") and is_host("linux") then -- Cross compile: use local prebuilt/cross-compiled binaries -- Expect libs+includes in deps/windows/{include,lib} add_includedirs("deps/windows/raylib/include", {public = true}) add_includedirs("deps/windows/sqlite3/include", {public = true}) add_linkdirs("deps/windows/sqlite3/lib", {public = true}) add_linkdirs("deps/windows/raylib/lib", {public = true}) add_links("raylib", "sqlite3") elseif is_plat("windows") then -- Windows native: use xmake-repo packages (MSVC or MinGW) add_requires("raylib 5.0") add_requires("sqlite3 3.50.0+400") end -- ============================================================ -- Functions -- ============================================================ function add_platform_packages(public) if is_plat("linux") then add_packages("pkgconfig::raylib", "pkgconfig::sqlite3", {public = public}) elseif is_plat("windows") and is_host("linux") then -- Cross-compilation, manual libs add_links("gdi32", "winmm", "user32", "kernel32", "opengl32", "shell32") elseif is_plat("windows") then add_packages("raylib", "sqlite3", {public = true}) end end -- ============================================================ -- Glymmer shared library -- ============================================================ target("glymmer") set_kind("shared") add_files("src/lib/**.c") add_includedirs("src/lib", {public = true}) add_platform_packages (true) on_install(function (target) -- Install headers into /usr/local/include/glymmer os.cp("src/lib/*.h", path.join(target:installdir(), "include/glymmer")) -- Install shared lib into /usr/local/lib os.cp(target:targetfile(), path.join(target:installdir(), "lib")) end) -- ============================================================ -- Demo executable -- ============================================================ target("demo") set_kind("binary") add_files("src/demo/**.c") add_platform_packages() add_deps("glymmer")
具体疑问
现在的配置下,raylib和sqlite3被嵌入到了glymmer库或者demo程序中,而不是作为独立的动态库被链接。我试过调整add_packages的参数,但没找到正确的方式。请问:
- 是不是
add_packages的使用逻辑有问题?应该用什么替代或者调整哪些参数? - 如何确保在所有平台(Linux、Windows原生、Linux交叉编译Windows)上,
glymmer和demo程序都只做动态链接,不嵌入任何依赖库的代码? - 有没有需要额外添加的规则或者编译/链接标志,强制Xmake保持所有库的独立性?
之后还要做CI配置,现在卡在这一步真的很着急,希望各位大佬能指点一下,谢谢大家了!




