我对cmake项目配置有疑问。
以下是我的项目结构。
trunk
|
|---- mylib
| |
| ---- mylib.h
| ---- mylib.c
| ---- *MYLIB_CMakeList.txt*
|
|---- alib
| |
| ---- alib.h
| ---- alibName.lib
| ---- *ALIB_CMakeList.txt*
|
|
|---- main
| |
| ---- main.cpp
| ---- *MAIN_CMakeList.txt*
|
---- *TOP_CMakeList.txt*
mylib 子文件夹包含用于创建自己的静态库的源代码(c)。此代码取决于 alib 。
main 子文件夹包含使用 mylib 的示例代码(C ++)。
以下是我编写CMakeList文件的方法:
**TOP_CMakeList.txt**
cmake_minimum_required(VERSION 3.4)
add_subdirectory(mylib)
add_subdirectory(alib)
add_subdirectory(main)
------------------------------------------------------------------------------------------------------------
**MYLIB_CMakeList.txt**
cmake_minimum_required(VERSION 3.4)
project(MyLib C)
if (WIN32)
set(CMAKE_SHARED_LIBRARY_PREFIX "")
endif ()
include_directories(${alib_INCLUDE_DIRS})
add_library(${PROJECT_NAME} STATIC mylib.c)
target_link_libraries(${PROJECT_NAME} alib)
set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
------------------------------------------------------------------------------------------------------------
**ALIB_CMakeList.txt**
cmake_minimum_required(VERSION 3.4)
project(ALib)
set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE)
set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
------------------------------------------------------------------------------------------------------------
**MAIN_CMakeList**
make_minimum_required(VERSION 3.4)
project(Executable CPP)
file(GLOB CPP_FILES *.cpp)
add_definitions(${MyLib_DEFINITIONS})
include_directories(${MyLib_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} ${CPP_FILES})
target_link_libraries(${PROJECT_NAME} MyLib)
使用此配置时,它无法识别 mylib 的 alib 依赖关系。特别是(我在Windows下开发)我收到了这个错误:
/usr/lib/gcc/x86_64-pc-cygwin/4.9.3 /../../../../ x86_64的-PC-cygwin的/ bin中/ LD: 找不到-lalibName.lib
我无法弄清楚如何正确地做到这一点。有什么建议吗?
答案 0 :(得分:0)
似乎alib
项目没有像mylib那样指定任何类型的库目标:
尝试将此添加到alibs的CMake文件
add_library(${PROJECT_NAME} STATIC <<< alib SOURCES HERE >>>)
答案 1 :(得分:0)
静态库不能具有依赖关系(好吧,它们可以,但它们不会自己拖动它们),因此在alib
中为另一个静态库提供target_link_libraries(...)
没有意义。您应该直接向alib
命令提供add_execuable
。
或者,您可以从mylib
和alib
构建一个大的静态库,但它不那么优雅并且依赖于平台。对于gcc,您应该查看ar工具。
删除add_subdirectory(alib)
命令,然后从alib子文件夹中删除CMake文件 - 您不需要它。然后在你的add_executable
命令的cmake文件中放入以下内容(在行之后);
link_directories(../alib)
target_link_libraries(${PROJECT_NAME} alibName.lib)