相关疑难解决方法(0)

如何指定OBJECT库的导入依赖项?

我有一个链接到主要目标的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::ZLIBmaintarget也不行,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>_*变量中通常可用的信息.这是一个讨厌的解决方法.

有没有更好的办法?

cmake

23
推荐指数
1
解决办法
3260
查看次数

将target_include_directories与对象库一起使用

我有一个CMake项目,它构建一个依赖于另一个静态库的静态库.我想把这个静态库变成一个对象库.当我这样做时,我得到一个编译器错误,我想我有一些关于对象库的东西.

这是我想要实现的一个例子.MyLib和MyLib2都是静态库,MyLib使用在MyLib2中定义和声明的函数.

MyLib
  CMakeList.txt
  MyLib.h
  MyLib.cpp
  MyLib2
    CMakeList.txt
    MyLib2.h
    MyLib2.cpp
Run Code Online (Sandbox Code Playgroud)

MyLib2 /的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib2)

add_library(${PROJECT_NAME} OBJECT MyLib2.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

MyLib中/的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib)

add_subdirectory(MyLib2)

add_library(${PROJECT_NAME} STATIC MyLib.cpp MyLib.h)
target_link_libraries(${PROJECT_NAME} MyLib2)
Run Code Online (Sandbox Code Playgroud)

MyLib.h包含MyLib2.h以使用它声明的函数.

#ifndef MyLib
#define MyLib

#include "MyLib2.h"

#endif
Run Code Online (Sandbox Code Playgroud)

当MyLib2构建为静态库时,我可以毫无问题地构建代码(我在Mac上使用make和clang).但是,当我将MyLib2转换为对象库时,我收到一个编译错误,指出无法找到MyLib2.h.

MyLib.h:4:10: fatal error: 'MyLib2.h'file not found
Run Code Online (Sandbox Code Playgroud)

以下是MyLib2是对象库时CMake文件的内容.

MyLib2 /的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib2)

add_library(${PROJECT_NAME} OBJECT MyLib2.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

MyLib中/的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib)

add_subdirectory(MyLib2)

add_library(${PROJECT_NAME} STATIC MyLib.cpp $<TARGET_OBJECTS:MyLib2>)
Run Code Online (Sandbox Code Playgroud)

当MyLib2是一个对象库时,我不明白为什么MyLib不再是MyLib2.h.也许使用target_include_directories的方式有问题.

cmake

5
推荐指数
1
解决办法
2359
查看次数

标签 统计

cmake ×2