CMake构建库和可执行文件一次并将其链接
CMake building library and executable once and linking it
我正试图同时使用cmake构建两个项目。我的文件夹结构如下:
project
├── CMakeLists.txt
├── build
├── out
├── lib
├── yanthra_engine
│ ├── CMakeLists.txt
│ └── ...
└───sandbox
├── CMakeLists.txt
└── ...
main CmakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
project(yanthra_console VERSION 0.1 DESCRIPTION "A 3d Game Engine.")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fexceptions")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING "Build type selections" FORCE)
add_subdirectory(yanthra_engine)
add_subdirectory(sandbox)
yanthra_engine/CMakeLists.txt
set(THIRD_PARTY_DIR "../../../third-party")
set(MAIN_SOURCE_DIR "../../main/src")
include_directories(${THIRD_PARTY_DIR}/SDL/include)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib )
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
file(GLOB_RECURSE CPP_HEADERS ${MAIN_SOURCE_DIR}/*.hpp)
file(GLOB_RECURSE CPP_SOURCES ${MAIN_SOURCE_DIR}/*.cpp)
add_library(
yanthra
SHARED
${CPP_HEADERS}
${CPP_SOURCES}
)
set (CMAKE_SHARED_LINKER_FLAGS "-F../yanthra_engine/Frameworks -framework SDL2 -framework OpenGL")
沙箱/CMakeLists.txt
set(THIRD_PARTY_DIR "../../main")
set(MAIN_SOURCE_DIR "./src")
include_directories(${THIRD_PARTY_DIR}/include)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../out)
file(GLOB_RECURSE CPP_HEADERS ${MAIN_SOURCE_DIR}/includes/*.h)
file(GLOB_RECURSE CPP_SOURCES ${MAIN_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE LIB ${MAIN_SOURCE_DIR}/../lib/*.dylib)
add_executable(
yanthra_sandbox
${CPP_HEADERS}
${CPP_SOURCES}
)
set_target_properties(
yanthra_sandbox
PROPERTIES
LINK_FLAGS
"-F../yanthra_engine/Frameworks -framework SDL2 -framework OpenGL"
)
target_link_libraries(yanthra_sandbox PRIVATE ${LIB})
我想知道我是否在每个构建模式下生成库文件,考虑到每个模式都将其输出构建到自己的文件夹,即库的lib/Debug(用于调试模式(和可执行文件的out/Debug,我将如何将其与相应的可执行文件链接。
您似乎没有将链接链接到yanthra
目标。不过,您应该这样做,因为这将自动选择使用当前配置编译的库。
沙盒/CMakeLists.txt
...
target_link_libraries(yanthra_sandbox PRIVATE yanthra ${LIB})
...
至于导入其他库:最好使用find_library
。这将自动设置链接选项,并使为yanthra_sandbox
添加这些选项成为不必要。
yanthra_engine/CMakeLists.txt
...
list(APPEND CMAKE_FRAMEWORK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Frameworks")
find_library(SDL2_LIB SDL2 REQUIRED)
find_library(OPEN_GL_LIB OpenGL REQUIRED)
target_link_library(yanthra PUBLIC "${SDL2_LIB}" "${OPEN_GL_LIB}")
这应该允许您从两个目标中删除编译器标志。如果lib目录中没有依赖项,您也可以删除对文件系统/上库的搜索
相关文章:
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- CreateProcess在退出后占用套接字端口(每个套接字地址只允许使用一次)
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- C++:链接库两次,全局构造函数运行两次吗?
- 链接列表中最后一项之后的项目是否为0
- 我写了一个函数来删除循环链接列表中的第 1 个节点,但输出显示无限次"55 44 33 22 11 99",那么我该如何解决呢?
- 是否有一种模式可以使用协议缓冲区而不针对LibProtobuf链接
- 如何使用同一链接列表一次处理各种类型的节点
- 无法通过一次编译所有文件来解决的链接器错误
- 确实将静态库链接了两次重复
- 一种方式链接列表和不需要的第一个元素AFRTER填充
- 有没有一种方法可以在不重建任何项目的情况下重新链接解决方案
- C++将节点添加到链表的开头一次后失败.其他方法也有问题
- 内置和静态链接的升压模块会导致 shutdown_service() 出现一堆链接器错误
- 链接堆栈模板和一堆错误
- 打印从套接字收到的字符,一次一个
- Android makefile 链接两次
- 一次删除多个节点链接列表
- 通过两次链接同一个库来解决循环依赖关系