0

我下载了一个框架并决定将其捆绑为 .so 以包含在我的其他项目中。该框架确实依赖于一些静态库。我在多篇文章中看到您无法将静态库链接到 .so 中,因为并非所有链接器都支持这一点。

所以我然后尝试将静态库链接到exe并链接.so。我收到错误说引用未定义(对静态库中的内容的引用)。

例如:

add_library(framework3 SHARED ${MY_SOURCES}) #produces libframework3.so

然后在exe项目中:

add_executable(renderer.exe ${MY_SOURCES})
target_link_libraries(tsx_renderer.exe framework3)
target_link_libraries (renderer.exe ${PROJECT_SOURCE_DIR}/Framework/Libs/libjpeg.lib)
target_link_libraries (renderer.exe ${PROJECT_SOURCE_DIR}/Framework/Libs/libpng.lib)

我得到的错误信息是:

/home/joe/ClionProjects/proj/build/libframework3.so: undefined reference to `jpeg_destroy_compress'
/home/joe/ClionProjects/proj/build/libframework3.so: undefined reference to `png_set_write_fn'
4

2 回答 2

1

将共享对象链接到静态库是可以的,只要您自己构建所有内容就不会出现任何问题。从某个地方导入静态库可能会给您带来一些痛苦。

通常静态库是自包含的,并且有所有相关的代码要执行。这意味着一些低级标准库的东西通常包含在 .a 中。如果您有多个来自不同平台/编译器的 .a,那么在链接期间您可能会遇到符号冲突/不匹配。

您尝试执行的操作不起作用,因为 libframework3.so 将尝试自行链接,而不是使用 renderer.exe 代码来解析符号。然后它将找不到您的 .lib 并失败

另一种解决方案可能是将静态库重新编译为共享对象并使用它们。

于 2014-11-08T05:34:55.420 回答
1

使用target_link_libraries时,似乎静态库未与 exe 正确链接。我将add_libraryIMPORTED属性一起使用:

add_library(TheStaticLibrary STATIC IMPORTED)
set_property(TARGET TheStaticLibrary PROPERTY IMPORTED_LOCATION "THE_LIBRARY_PATH")

希望能帮助到你...

于 2014-11-17T16:06:52.223 回答