Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake:使用需要静态libs的动态库构建exe_Cmake_Clion - Fatal编程技术网

CMake:使用需要静态libs的动态库构建exe

CMake:使用需要静态libs的动态库构建exe,cmake,clion,Cmake,Clion,我下载了一个框架,并决定将其打包为一个.so,以便包含在我的其他项目中。不过,该框架确实依赖于一些静态lib。我在多篇文章中看到,您无法将静态lib链接到。所以,因为并非所有链接器都支持此功能 然后我尝试将静态libs链接到exe,并将.So链接到。我得到的错误是引用未定义(引用静态libs中的内容) 例如: add_library(framework3 SHARED ${MY_SOURCES}) #produces libframework3.so 然后在exe项目中: add_execut

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

然后我尝试将静态libs链接到exe,并将.So链接到。我得到的错误是引用未定义(引用静态libs中的内容)

例如:

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'

将共享对象链接到静态libs很好,只要您自己构建所有内容,就不会有任何问题。从某处导入静态库可能会给您带来一些麻烦

通常静态库是自包含的,并具有所有要执行的相关代码。这意味着一些低级别的标准库内容通常包含在.a中。如果有多个.a来自不同的平台/编译器,则在链接过程中可能会出现符号冲突/不匹配

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


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

在使用目标链接库时,静态库似乎没有正确链接到exe。 我使用了带有导入属性的add_库:

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

希望它能有所帮助……

事实上,这就是问题所在,我也能使用“z”这个短名称来包含lib,这让我有点不舒服。