微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用外部附加头文件构建cmake对象库

如何解决使用外部附加头文件构建cmake对象库

我想在cmake对象libray mylib中构建测试可执行文件。这只是一个简单的测试设置。该库包含一个src a.c一个文件a.h。问题在于cmake对象lib还需要为配置a_config.h添加一个附加头。我没有找到使用附加标头和对象库构建可执行文件解决方案。 因此,我将示例推送到了github:https://github.com/mgiaco/mylib/blob/master/verify/CMakeLists.txt

文件夹结构:

 mylib
     build
     include
       a.h
     src
       a.c
     verify
       source
         a_config.h
         mylib_test.c
         CMakeList.txt   // one
     CMakeList.txt       // two

CMakeList.txt(一个

list (APPEND verify_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/source)
message("mylib")
list (APPEND verify_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/source/mylib_test.c)

add_executable(verify_exe ${verify_SOURCE} ${verify_HEADER})
target_include_directories(verify_exe PUBLIC ${verify_HEADER})
target_link_libraries(verify_exe $<TARGET_OBJECTS:mylib_obj>)

CMakeList.txt(两个)

cmake_minimum_required(VERSION 3.13)
message("verify")
project(mylib VERSION 1.0.0)

add_library(${PROJECT_NAME}_obj OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/a.c)

target_include_directories(${PROJECT_NAME}_obj
    PUBLIC 
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)
    
add_subdirectory(verify)

运行和错误

C:\workdir\io\mylib\build (master)
λ cmake.exe -DCMAKE_SH="CMAKE_SH-NOTFOUND" -G"MinGW Makefiles" ..
verify
mylib
-- Configuring done
-- Generating done
-- Build files have been written to: C:/workdir/io/mylib/build

C:\workdir\io\mylib\build (master)
λ mingw32-make.exe
[ 33%] Building C object CMakeFiles/mylib_obj.dir/src/a.c.obj
C:\workdir\io\mylib\src\a.c:10:10: Fatal error: a_config.h: No such file or directory
 #include "a_config.h"
          ^~~~~~~~~~~~
compilation terminated.
mingw32-make[2]: *** [CMakeFiles\mylib_obj.dir\build.make:63: CMakeFiles/mylib_obj.dir/src/a.c.obj] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:95: CMakeFiles/mylib_obj.dir/all] Error 2
mingw32-make: *** [Makefile:83: all] Error 2

在这里做错了什么?

谢谢 Mathias

解决方法

您不想构建源,那么创建库不是解决方案-库是已编译源的集合。通常,我会执行允许用户轻松添加库的功能:

# mylib/CMakeList.txt

# 'a' as in the library named 'a',not as an article but as a name
set(_add_a_library_source_dir ${CMAKE_CURRENT_LIST_DIR})
function(add_a_library name)
   add_library(${name} ${ARGN} ${_add_a_library_source_dir}/src/a.c)
   taget_include_directories(${name}
       PUBLIC 
           $<BUILD_INTERFACE:${_add_a_library_source_dir}/include>
    )
endfunction()

然后该库的用户可以执行以下操作:

# mylib/verify/CMakeLists.txt

add_a_library(verify_a_library OBJECT)
# add path to a_config.h to a library
target_include_directories(verify_a_library ${CMAKE_CURRENT_SOURCE_DIR})

add_executable(verify_exe ${sources})
target_link_libraries(verify_exe verify_a_library)

即使他们需要多个版本。

注意:如果您掌握了足够的新知识,则无需使用$<TARGET_OBJECTS,只需与对象库链接即可。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。