Linux cmake编译但不链接库中的新源文件(libonion)

Linux cmake编译但不链接库中的新源文件(libonion),linux,cmake,Linux,Cmake,我是一个cmake新手(在Debian/Sid/Linux/x86-64上) 我用libonion来支持使用Boehm的垃圾收集器定制malloc;看 我在那里添加了两个文件onion/src/low_util.c和onion_src/low_util.h(即#在其他几个补丁文件中成功地包含了-d) 它已编译但未链接 set(SOURCES onion.c codecs.c dict.c low_util.c request.c response.c handler.c

我是一个
cmake
新手(在Debian/Sid/Linux/x86-64上)

我用libonion来支持使用Boehm的垃圾收集器定制
malloc
;看

我在那里添加了两个文件
onion/src/low_util.c
onion_src/low_util.h
(即
#在其他几个补丁文件中成功地包含了
-d)

它已编译但未链接

 set(SOURCES onion.c codecs.c dict.c low_util.c request.c response.c handler.c 
                    log.c sessions.c sessions_mem.c shortcuts.c block.c mime.c url.c ${POLLER_C}
        listen_point.c request_parser.c http.c ${HTTPS_C} websocket.c ${RANDOM_C} ${SQLITE3_C})
Linking C executable otemplate
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_new':
dict.c:(.text+0x1bc): undefined reference to `onionlow_calloc'
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_node_data_free':
dict.c:(.text+0x2ec): undefined reference to `onionlow_free'
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_node_add':
后来:

 SET(INCLUDES_ONION block.h codecs.h dict.h handler.h http.h https.h listen_point.h low_util.h log.h mime.h onion.h poller.h request.h response.h server.h sessions.h shortcuts.h types.h types_internal.h url.h websocket.h ${SQLITE3_H})
 MESSAGE(STATUS "Found include files ${INCLUDES_ONION}")
但是当我打开时,我的文件
low_util.c
被编译但没有链接

 set(SOURCES onion.c codecs.c dict.c low_util.c request.c response.c handler.c 
                    log.c sessions.c sessions_mem.c shortcuts.c block.c mime.c url.c ${POLLER_C}
        listen_point.c request_parser.c http.c ${HTTPS_C} websocket.c ${RANDOM_C} ${SQLITE3_C})
Linking C executable otemplate
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_new':
dict.c:(.text+0x1bc): undefined reference to `onionlow_calloc'
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_node_data_free':
dict.c:(.text+0x2ec): undefined reference to `onionlow_free'
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_node_add':
请注意,
libonion
是一个库(在C语言中,提供HTTP服务),我只想添加一个
low_util.C
文件(包装
malloc
&
pthread\u create
等…以使Boehm的GC满意:它正在调用
GC\u malloc
GC\u pthread\u create
)用它的
low_util.h
头。令人惊讶的是,它们被编译了,但似乎没有链接。我不熟悉
cmake
,也不熟悉D.Moreno(libonia
的主要作者)是如何组织他的cmake文件的


有什么线索吗?

根据你发布的内容,很难判断什么是错的。上面的蛋糕源代码说,一个变量
${SOURCES}
相当于
onion.c codecs.c dict.c low_util.c…${SQLITE3_c}
,一个变量
${INCLUDE_onion}
相当于
block.h codecs.h dict.h…${SQLITE3_h}
。您没有提供任何目标或这些目标中包含的文件

可能有帮助的事情的简要列表:

  • 在哪里定义顶级库或可执行文件?如果要创建库,则需要该命令。如果要创建可执行文件,则需要
    add\u executable()
    命令
  • 使用该命令解析依赖关系。不要将所有源文件放在单个库中,而是将类似的文件分组到单个目标中(目标由add_*命令定义),并在编译后使用该命令链接目标
  • 使用find_package()获取系统上定义但不在项目中的任何库。然后,使用
    target\u link_libraries()
    命令链接到该库

在这种情况下,如果在同一个库中定义了
onion\u dict.*
函数,则不会将这些文件包含在库中。使用“添加库”或“添加可执行文件”时,请确保将这些文件添加到列表中。如果这些函数在项目中,但不在同一个库中,请使用
target\u link\u libraries()
命令链接到包含正确文件的库。如果这些命令是在外部库中定义的,则首先使用
查找包()
查找库,然后使用
目标链接库()链接到库

应用以下修补程序使其链接。与从添加的.c文件生成的符号链接的两个可执行文件丢失,并添加到修补程序中


我不使用
cmake
.D.Moreno(libonion
的作者)使用它。我只想修补他的库并测试我的修补程序…我很难理解你想做什么。如果你要在洋葱/src目录中添加其他文件,你需要通过添加你自己的库(使用add_library())来修补洋葱/src/CMakeLists.txt文件它包含您的源文件,并使用target_link_libraries()将新库链接到预包库。如果您只是修补源文件,则不需要接触CMake文件。谢谢,David Moreno建议了一个等效的修补程序,现在一切都好了!