我有一个链接到主要目标的OBJECT库.该有一个相关库,说.如果我们使用遗留变量,那么很容易:objlibmaintargetobjlibZLIB<package-name>_*
add_library(objlib OBJECT ...)
target_include_directories(objlib ${ZLIB_INCLUDE_DIRS})
...
add_executable(maintarget $<TARGET_OBJECTS:objlib>)
target_link_libraries(maintarget ${ZLIB_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
但我想将依赖项用作IMPORTED库,因为它更简洁(创建配置模块的便捷方式,即使用install(EXPORT ...),就是这样).
以下代码不起作用,因为target_link_libraries不能与OBJECT库一起使用:
add_library(objlib OBJECT ...)
target_link_libraries(objlib ZLIB::ZLIB)
Run Code Online (Sandbox Code Playgroud)
链接ZLIB::ZLIB到maintarget也不行,objlib没有得到包括目录:
add_library(objlib OBJECT ...)
...
add_executable(maintarget $<TARGET_OBJECTS:objlib>)
target_link_libraries(maintarget ZLIB::ZLIB)
Run Code Online (Sandbox Code Playgroud)
使用中间INTERFACE库(objlib-wrapper)进行黑客攻击也不起作用.
唯一有效的方法是查询IMPORTED库的属性并重新生成<package-name>_*变量中通常可用的信息.这是一个讨厌的解决方法.
有没有更好的办法?
我不明白使用DLL的.def文件的意义.
它似乎取代了在您的DLL代码中使用显式导出的需要(即显式__declspec(dllexport))但是我不能在不使用这些时生成lib文件,然后在使用DLL时创建链接器问题.
那么在与客户端应用程序链接时如何使用.def,它们是否取代了使用头文件或.lib文件的需要?
我是C++构建流程的新手,我正在考虑切换为我的库使用部分链接而不是创建ar存档.我希望在我不可避免的最终编译步骤中减少链接时间,并且我想要部分链接一些库可以节省我在最后一步中链接所有内容的时间.
我所描述的可能吗?我认为它应该是一些事情ld -Ur -o mylib.o [components].是否有重要的构建注意事项,我没有考虑到?
我正在将AutoTools项目移植到CMake。
AutoTools的作用:
我已经设法使用CMake进行了以下操作:
add_library(staticfoo <src>)add_library(sharedfoo SHARED <src>)并将它们链接-target_link_libraries(sharedfoo staticfoo)target_link_libraries(exe sharedfoo),但这也再次将静态库拖入其中。因此,可执行文件的结果链接命令除了共享外还具有静态库。这与AutoTools项目生成的命令不对应。
我已经尝试过了target_link_libraries(sharedfoo PRIVATE staticfoo),但这并不能将符号从静态库获取到共享库的接口中。
如何获得没有“传递”行为的符号?
(以与平台无关的方式)