1

我想使用 CMake 从 libfoo.a 创建一个 liboo.so。

到目前为止我有

include_directories(third-party/includes)
find_library(${thirdparty_LIBRARIES} foo PATHS third-party/lib)
add_library(boo SHARED empty.cpp)
target_link_libraries(boo ${thirdparty_LIBRARIES})
add_executable(runBoo main.cpp)
target_link_libraries(runBoo boo)

main 从 libfoo.so 调用函数。但是会引发错误:

main.cpp:(.text+0x26): undefined reference to `Foo::Foo()'
main.cpp:(.text+0x50): undefined reference to `Foo::sayHello(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'

我猜这些符号没有添加,因为 empty.cpp 不使用它们,但我不确定这是问题所在以及如何克服它。

我见过CMake:如何从子项目的所有静态库中创建单个共享库?,但我现在更愿意坚持使用较低版本的 cmake。

我还看到了如何将静态库链接到 gcc 中的动态库,但我无法让它工作,而且我正在使用 CMake。

4

2 回答 2

0

这只是一个愚蠢的错误。更正后的代码是:

   include_directories(third-party/includes)

   find_library(thirdparty_LIBRARIES foo PATHS third-party/lib) //remove the ${}!

   add_library(boo SHARED empty.cpp)
   target_link_libraries(boo ${thirdparty_LIBRARIES})
   add_executable(runBoo main.cpp)
   target_link_libraries(runBoo boo)
于 2013-04-09T16:34:51.093 回答
0

选择的答案不正确。您正在将空源文件编译到共享库中。然后,您尝试将静态库链接到此共享库。由于编译的代码中没有用到静态库,所以不会被链接,会被忽略。因此,您必须添加-whole-archive链接器标志以强制链接静态库,如下所示。

add_library(my_shared_lib SHARED src/empty.cpp)
SET(MY_LIB_LINK_LIBRARIES -Wl,--whole-archive my_static_library.a -Wl,--no-whole-archive)
target_link_libraries(my_shared_lib ${MY_LIB_LINK_LIBRARIES})
于 2021-12-14T18:42:56.417 回答