【问题标题】:Can't statically link boost libraries with cmake无法将 boost 库与 cmake 静态链接
【发布时间】:2012-10-07 18:02:33
【问题描述】:

我有提升信号库,构建于:

./b2 address-model=32 link=static --build-type=complete --with-signals --layout=tagged

简单代码:

#include <iostream>
#include "boost/signal.hpp"

void onSignal() {
 std::cout << "Hello from slot" << std::endl;
}

int main() {
  boost::signal<void()> sig;
  sig.connect(&onSignal);
  sig();
 return 0;
}

CmakeLists.txt:

project(test)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -static")
aux_source_directory(. SRC_LIST)
include_directories(/home/koshchiy/dev/boost/boost_1_51_0)
link_directories(/home/koshchiy/dev/boost/boost_1_51_0/stage)

add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} libboost_signals-mt-s.a)

它构建没有错误,但在运行时,我得到了:

bash: ./test: No such file or directory

似乎是,cmake 生成动态链接而不是静态链接:

koshchiy@koshchiy-lin-NB:~/dev/projects/test/test-build-release$ ldd test
linux-gate.so.1 =>  (0xf778b000)
libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf768e000)
libc.so.6 => /lib32/libc.so.6 (0xf74e7000)
libm.so.6 => /lib32/libm.so.6 (0xf74bc000)
/usr/lib/libc.so.1 => /lib/ld-linux.so.2 (0xf778c000)
libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf749e000)

没有 cmake 的构建似乎还可以:

g++ -static main.cpp -o test -I... -l...

我使用的是 ubuntu 12.04 x64 和 g++-4.7 编译器。

【问题讨论】:

  • 如果你在执行 ./test 时得到“没有这样的文件或目录”,我相信你要么在错误的路径中,要么它没有构建。 ~/dev/projects/test/test-build-release/test 之前是否已经创建?

标签: boost cmake


【解决方案1】:

您的手动构建是在没有您在 CMAKE_CXX_FLAGS 的 CMakeLists.txt 中使用的 -m32 标志的情况下完成的。

因此,使用 cmake 构建会生成 32 位可执行文件,即使该文件存在,它也无法使用“没有此类文件”,因为您的系统上缺少对 32 位的二进制支持。

要么删除 CMakeFiles.txt 的 -m32,要么尝试为您的系统和 gcc 版本安装 gcc-multilib 支持。

如果您想强制静态链接到您的 cmake-build,请检查 this answer 是否可以帮助您。

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多