相关疑难解决方法(0)

当存在同名共享库时,如何强制链接到静态库

假设我有一个main.cpp使用sin()定义的函数的文件libmath.还假设我们在同一目录中同时提供libmath.a和libmath.so.现在,如果我发出命令g++ -o main main.cpp -lmath,Linux的默认行为是链接到共享库libmath.so.我想知道有没有办法强制程序与静态库链接libmath.a而不删除或移动共享库?

linux gcc g++ ld

30
推荐指数
3
解决办法
2万
查看次数

静态链接 libc

我正在尝试使用 CMake 3.15 制作静态可执行文件。我正在 Alpine Linux 上构建(因此使用 musl),目前,我的可执行文件的 ldd 输出是:

# ldd my_executable
    /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fc6f65b3000)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fc6f659f000)
Run Code Online (Sandbox Code Playgroud)

我可以设置target_link_options(my_executable PRIVATE -static-libgcc -static-libstdc++),并且它们静态链接:

# ldd my_executable
    /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
Run Code Online (Sandbox Code Playgroud)

但我无法让 musl 静态链接。我尝试过(使用干净的构建,以确保配置步骤从零开始):

  1. 添加-statictarget_link_options上面。
  2. set(CMAKE_EXE_LINKER_FLAGS "-static")在致电之前add_executable(my_executable ...)
  3. 添加-statictarget_link_libraries(my_executable lib1 lib2 -static)

当我在模式下运行 CMake 时VERBOSE=1,它​​总是以以下方式结束链接命令:

... -Wl,-Bdynamic -ldl -lrt -lm -lpthread
Run Code Online (Sandbox Code Playgroud)

我相信这是我的问题:我想摆脱它-Bdynamic。我缺少什么?这是-Bdynamic来自我的依赖项之一吗?我将它们全部从源代码构建为静态 ( .a …

cmake libc

2
推荐指数
1
解决办法
5494
查看次数

标签 统计

cmake ×1

g++ ×1

gcc ×1

ld ×1

libc ×1

linux ×1