【问题标题】:From Makefile to Cmake从 Makefile 到 Cmake
【发布时间】:2014-09-10 15:28:05
【问题描述】:

由于 CLion 发布,我想从 make 迁移到 CMake。 所以我有一堆.cpp 和.hpp 文件的源文件夹和一个main.cpp 使用上面源代码的类 - 到目前为止,我有简单的Makefile 来编译、链接和使用main.cpp 执行执行:

C_OBJS := $(shell find source/*/ -name '*.cpp')
SOURCES=source/main.cpp $(C_OBJS)
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=bin/main

$(EXECUTABLE_T): $(OBJECTS_T) 
$(CC) $(LDFLAGS) $(OBJECTS_T) -o $@

$(EXECUTABLE): $(OBJECTS) 
$(CC) $(LDFLAGS) $(OBJECTS) -o $@

%.o: %.cpp 
$(CC) $(CFLAGS) $< -c -o $@

all: $(EXECUTABLE)

在 Cmake 中,我遇到了这样的事情:

cmake_minimum_required(VERSION 2.8.4)
project(Main)

#grab all file we need to compile
file(GLOB SRC
    "source/*.h"
    "source/*.hpp"
    "source/*.cpp"
)

#compile to .o files all we need
add_library( myLib ${SRC} )

set(SOURCE_FILES source/main.cpp)

#compile to .o main.cpp
add_executable( Main ${SOURCE_FILES} )

#link them all
target_link_libraries( Main myLib )

但是我在链接时不断获得对所有类的“未定义引用”,并且通过编译时间判断感觉并不是所有内容都已编译。你能帮忙吗? :)

【问题讨论】:

  • 如果您的source 目录有一些子文件夹,您可能应该使用file(GLOB_RECURSE ... 而不是file(GLOB ...
  • 另外,您的source/main.cpp 文件将被编译成myLib。这是理想的行为吗?
  • 啊……现在可以了!对不起,我认为它默认是递归的。非常感谢 :) 不,main.cpp 不在 source - 抱歉笨拙的复制粘贴。
  • 我们不建议使用 GLOB 从源代码树中收集源文件列表。如果在添加或删除源时没有 CMakeLists.txt 文件发生更改,则生成的构建系统无法知道何时要求 CMake 重新生成。 - 引用 the CMake manual。

标签: c++ makefile cmake


【解决方案1】:

尝试将库设为静态而不是共享。

add_library( myLib STATIC ${SRC} )

否则默认情况下您将获得一个共享库,这需要适当的导出宏。

如果没有导出宏,则库中的符号(例如方法)不会被导出,因此在链接时不可用。 Windows 上的共享库始终需要正确的导出宏,并且在设置-fvisibility=hidden 时,Unix 上的共享库也需要正确的导出宏,通常是这种情况。

另外,正如其他人所说,不要使用 GLOB,而是按照http://www.cmake.org/cmake/help/v3.0/command/file.html 明确列出您的文件。但这是一个很好的做法,与您的实际链接错误无关。

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多