【问题标题】:Need some help creating a cmake file to get my project to work...convert from cmake需要一些帮助来创建一个 cmake 文件以使我的项目正常工作...从 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,如下所示:stackoverflow.com/a/3201211/487892
  • 我不使用 globbing 我在创建新文件时将每个文件添加到我的源变量中。即使我的 CMake 项目包含数千个源文件。
  • @drescherjm 正确。完全是在猜测和希望。我现在正在放入我的实际文件。
  • 我编辑了最初的帖子。现在,它通过 cmake 实现了,但是当我尝试实现它时,我遇到了一些它找不到的问题。其中一个源文件被编译为 .o ...我如何包含它以帮助我的项目编译?

标签: c++ linux makefile cmake embedded


【解决方案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 不需要知道?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2013-07-13
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多