You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Xmake配置求助:如何防止依赖库被嵌入自有共享库及二进制程序

Xmake配置求助:如何防止依赖库被嵌入自有共享库及二进制程序

各位Xmake大佬好,我最近刚接触Xmake,折腾了快30小时(还找了ChatGPT和谷歌AI帮忙),还是卡在依赖动态链接的问题上,实在有点头大,想请大家帮我看看怎么解决!

问题背景与核心需求

我正在开发一个叫glymmer的共享库,它依赖raylibsqlite3,同时还有一个demo二进制程序需要使用这个库。因为LGPL协议的限制,我必须保持所有依赖为独立动态库,绝对不能静态嵌入

  • 目标1:glymmer作为独立共享库,仅做动态链接,不嵌入raylib和sqlite3的代码
  • 目标2:demo程序需要同时动态链接glymmerraylibsqlite3这三个独立的动态库文件
  • 当前问题:依赖库被意外嵌入到了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配置,现在卡在这一步真的很着急,希望各位大佬能指点一下,谢谢大家了!

火山引擎 最新活动