需要一些帮助来创建一个 cmake 文件以使我的项目正常工作...从 cmake 转换

Posted

技术标签:

【中文标题】需要一些帮助来创建一个 cmake 文件以使我的项目正常工作...从 cmake 转换【英文标题】:Need some help creating a cmake file to get my project to work...convert from cmake 【发布时间】:2016-09-01 16:21:35 【问题描述】:

我知道没有直接的方法可以将 make 文件转换为 cmake,但需要一些指导。我有一个嵌入式机器的 make 文件,并希望使用 cmake 继续前进。

我在 linux 开发机器上为运行 linux 内核的嵌入式 arm 进行交叉编译。

目前,所有文件都在同一个文件夹中。我正在努力将它们移至此结构: -建造 -文档 -包括 -src CMakeLists.txt -测试 CMakeLists.txt

我想把头文件放在/includes文件夹,c/cpp文件放在src文件夹。

OUT = enterprise.exe
CC = g++
CCFLAGS = -lrt -Wall -pthread

HEADERS = logobj.h message.h channel.h utilities.h parameter.h mycan.h vthread.h logger.h protocol_quest.h protocol_can.h protocol_io.h protocol_navitrol.h qt_nav.h qt_battery.h qt_iodealer.h enterprise.h
OBJECTS = logobj.o message.o channel.o utilities.o parameter.o mycan.o vthread.o logger.o protocol_quest.o protocol_can.o protocol_io.o protocol_navitrol.o qt_nav.o qt_battery.o qt_iodealer.o enterprise.o

GPIOHEADERS = evgpio.h 
GPIOOBJECTS = evgpio.o

%.o: %.c $(HEADERS)
        $(CC) $(CCFLAGS) -c -o $@ $<

%.o: %.c $(GPIOHEADERS)
        $(CC) $(CCFLAGS) -c -o $@ $< -mcpu=arm9

$(OUT): $(OBJECTS) $(GPIOOBJECTS)
        $(CC) $(CCFLAGS) -o $@ $^ $(LIB)

clean:
    -rm -f $(OBJECTS) $(GPIOOBJECTS)
    -rm -f $(OUT)

我想它会是这样的:

顶层文件夹 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(enterprise)
set(CMAKE_CXX_COMPILER /opt/toolchains/arm-2008q3/bin/arm-none-linux-gnueabi-g++)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(COMPILE_FLAGS "-lrt -Wall -pthread")
add_subdirectory(src)

/src 文件夹 CMakeLists.txt

include_directories($CMAKE_CURRENT_SOURCE_DIR)   //haven't moved the headers yet
set(SOURCES $CMAKE_CURRENT_SOURCE_DIR filename1.cpp filename2.cpp  etc.cpp)
set(vendorLib filenameVendor1.o filenameVendor2.o etcVendor.o)

add_executable(enterprise $SOURCES)
target_link_libraries(enterprise vendorLib)

我的一部分认为应该有一些链接,但不确定在哪里。 此时,我可以通过 cmake 过程,但 make 失败。 未定义的引用等...

想法?

*****EDIT** 更新了 src/CMakeLists.txt 以包含来自测试的 cmets 和更新。

【问题讨论】:

set(SOURCES ./*.c ./*.cpp) 上次我检查您必须使用 FILE 命令手动 glob,如下所示:***.com/a/3201211/487892 我不使用 globbing 我在创建新文件时将每个文件添加到我的源变量中。即使我的 CMake 项目包含数千个源文件。 @drescherjm 正确。完全是在猜测和希望。我现在正在放入我的实际文件。 我编辑了最初的帖子。现在,它通过 cmake 实现了,但是当我尝试实现它时,我遇到了一些它找不到的问题。其中一个源文件被编译为 .o ...我如何包含它以帮助我的项目编译? 【参考方案1】:

您需要将所有源文件添加到可执行文件中:

add_executable(enterprise $SOURCES)

或者至少添加构建可执行文件所需的所有源文件。

如果你有库,那么你也需要添加它们:

target_link_libraries(enterprise rt)

欲了解更多信息please read the documentation。

【讨论】:

知道了。我想我的大问题是我有 .h 文件,那是什么 include_directories($CMAKE_CURRENT_SOURCE_DIR) 另外,我有来自供应商的 .o 文件来与他们的系统交互,是否属于 add_library(vendor vendor.o) 等... @wegunterjr 你如何包含它们?使用引号(如#include "some_header_file.h")还是使用尖括号(如#include &lt;some_header_file.h&gt;)?如果使用引号,则无需执行任何操作,因为预处理器将在与源文件相同的目录中查找。 复制。我的意思是让 cmake 用于编译...还是 cmake 不需要知道?

以上是关于需要一些帮助来创建一个 cmake 文件以使我的项目正常工作...从 cmake 转换的主要内容,如果未能解决你的问题,请参考以下文章

CMake 支持“进行卸载”吗?

如何更改我的 FFMPEG 命令以使我的 HTTP Live Streams 更高效?

如何在 CMake 项目中包含外部库

CMake Release 使我的代码停止正常工作

是否有一种 Pythonic 的方式来跳过 for 循环中的 if 语句以使我的代码运行得更快?

(CMake杂记) —— 利用 CMake 创建项目的分组