将makefile转换为cmakelists,从哪里开始



我在INET上搜索,但我没有找到任何明确的答案。您能指出我如何将makefile转换为cmakelists的正确方向?

我想这样做,因为我既是换成制造的又是Cmake的新手。在我的工作中,cmake更加使用,因为我需要开始使用其中一个,所以我更喜欢在cmake中使用所有内容。我知道cmake正在生成一个makefile,但对我而言,cmake比makefile更容易阅读。

我有以下makefile:

PREFIX ?= /usr/local
CC = gcc
AR = ar
CFLAGS = -std=gnu99 -fPIC -Wall -Wno-unused-parameter -Wno-unused-function -I. -O4
APRILTAG_SRCS := $(shell ls *.c common/*.c)
APRILTAG_HEADERS := $(shell ls *.h common/*.h)
APRILTAG_OBJS := $(APRILTAG_SRCS:%.c=%.o)
TARGETS := libapriltag.a libapriltag.so 
# LIBS := -Lusr/include/flycapture
.PHONY: all
all: $(TARGETS)
    @$(MAKE) -C example all
.PHONY: install
install: libapriltag.so
    @chmod +x install.sh
    @./install.sh $(PREFIX)/lib libapriltag.so #this should be the line that install the library
    @./install.sh $(PREFIX)/include/apriltag $(APRILTAG_HEADERS)
    @sed 's:^prefix=$$:prefix=$(PREFIX):' < apriltag.pc.in > apriltag.pc
    @./install.sh $(PREFIX)/lib/pkgconfig apriltag.pc
    @rm apriltag.pc
    @ldconfig
libapriltag.a: $(APRILTAG_OBJS)
    @echo "   [$@]"
    @$(AR) -cq $@ $(APRILTAG_OBJS)
libapriltag.so: $(APRILTAG_OBJS)
    @echo "   [$@]"
    @$(CC) -fPIC -shared -o $@ $^
%.o: %.c
    @echo "   $@"
    @$(CC) -o $@ -c $< $(CFLAGS)
.PHONY: clean
clean:
    @rm -rf *.o common/*.o $(TARGETS)
    @$(MAKE) -C example clean

我不是要你做我的工作,但我想拥有某种指南或一个好的链接。

该项目同时包含C 编程语言。

我开始创建一个新的cmakelists.txt文件,但它仍然无法正常工作。它给我以下错误:您已将库librapriltag.a拨打add_library,而无需任何源文件。这通常表明您的cmakelists.txt文件

-- Configuring done
CMake Error: Cannot determine link language for target "librapriltag.a".
CMake Error: CMake can not determine linker language for target: librapriltag.a
-- Generating done
-- Build files have been written to: .....

我开始创建的cmakelists.txt如下:

project( apriltag2 C CXX)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_C_FLAGS "-std=gnu99 -fPIC -Wall -Wno-unused-parameter -Wno-unused-function -I. -O4")
include_directories("/home/fschiano/Repositories/apriltag2")
include_directories("/home/fschiano/Repositories/apriltag2/common")
add_library( librapriltag.a )

有效的cmakelists.txt如下:

project( apriltag2 )
cmake_minimum_required(VERSION 2.8)
set(CMAKE_C_FLAGS "-std=gnu99 -fPIC -Wall -Wno-unused-parameter -Wno-unused-function -I. -O4")
message("CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR}")
file(GLOB apriltag_SRC "*.c")
file(GLOB apriltag_HEADERS "*.h")
set(APRILTAG_SRCS ${apriltag_SRC})
set(APRILTAG_HEADERS ${apriltag_HEADERS})
message(STATUS "CMAKE_CURRENT_LIST_DIR=${CMAKE_CURRENT_LIST_DIR}")
add_library(apriltag STATIC ${APRILTAG_SRCS})
target_include_directories(apriltag PUBLIC ${CMAKE_SOURCE_DIR})
target_compile_options(apriltag PUBLIC -fPIC -Wall -Wno-unused-parameter -Wno-unused-function -O4)
install(TARGETS apriltag
        ARCHIVE DESTINATION lib
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib)
install(DIRECTORY CMAKE_CURRENT_LIST_DIR/include/
        DESTINATION CMAKE_CURRENT_LIST_DIR/include/
        FILES_MATCHING PATTERN *.h)

编辑:

某事仍然不对。如果我想在库中更改某些内容,例如/home/fschiano/Repositories/apriltag2/common中的内容如果我在进行所有这些修改之前使用我拥有的makefile,我会这样做:

  1. make

  2. 在我想修改的文件中进行一些修改

  3. sudo make install,这将为我提供以下输出:

    /usr/local/lib/libapriltag.so
    /usr/local/include/apriltag/apriltag.h
    /usr/local/include/apriltag/common/g2d.h
    /usr/local/include/apriltag/common/getopt.h
    /usr/local/include/apriltag/common/homography.h
    /usr/local/include/apriltag/common/image_f32.h
    /usr/local/include/apriltag/common/image_u8.h
    /usr/local/include/apriltag/common/image_u8x3.h
    /usr/local/include/apriltag/common/matd.h
    /usr/local/include/apriltag/common/math_util.h
    /usr/local/include/apriltag/common/pnm.h
    /usr/local/include/apriltag/common/postscript_utils.h
    /usr/local/include/apriltag/common/string_util.h
    /usr/local/include/apriltag/common/svd22.h
    /usr/local/include/apriltag/common/thash_impl.h
    /usr/local/include/apriltag/common/timeprofile.h
    /usr/local/include/apriltag/common/time_util.h
    /usr/local/include/apriltag/common/unionfind.h
    /usr/local/include/apriltag/common/workerpool.h
    /usr/local/include/apriltag/common/zarray.h
    /usr/local/include/apriltag/common/zhash.h
    /usr/local/include/apriltag/common/zmaxheap.h
    /usr/local/include/apriltag/tag16h5.h
    /usr/local/include/apriltag/tag25h7.h
    /usr/local/include/apriltag/tag25h9.h
    /usr/local/include/apriltag/tag36artoolkit.h
    /usr/local/include/apriltag/tag36h10.h
    /usr/local/include/apriltag/tag36h11.h
    /usr/local/lib/pkgconfig/apriltag.pc
    /sbin/ldconfig.real: /usr/lib/libstdc++.so.5 is not a symbolic link
    

修改将生效。

现在,如果我删除了makefile,我确实可以:

  1. cmake。

  2. make

  3. 在我想修改的文件中进行一些修改

  4. sudo进行安装,它为我提供以下输出:

    安装项目... - 安装配置:" - 最新:/usr/local/lib/libapriltag.a

所以看来cmakelists.txt的安装部分不正确!

文件install.sh为以下。

PREFIX ?= /usr/local

您可以尝试帮助我吗?谢谢

让我们逐步浏览一下:

CC = gcc
AR = ar

我们忽略了这一点,因为这是默认值。可以被CMAKE_C_COMPILER覆盖。

CFLAGS = -std=gnu99 -fPIC -Wall -Wno-unused-parameter -Wno-unused-function -I. -O4

也忽略了这些。使用CMAKE_CXX_COMPILERCMAKE_C_COMPILER_ID MATCHES GNU强行切换编译器。

APRILTAG_SRCS := $(shell ls *.c common/*.c)

它们对于类似GCC的编译器非常特别。定义目标后,将它们设置为set(C_STANDARD 98)的条件下方。该标准由set(CXX_STANDARD 98)set(APRILTAG_SRCS ...)

设置
APRILTAG_HEADERS := $(shell ls *.h common/*.h)

定义一个变量列出所有源文件:set(APRILTAG_HEADERS ...)

APRILTAG_OBJS := $(APRILTAG_SRCS:%.c=%.o)

单独定义所有标头文件的变量:add_library。但是,您真的不需要它们(除非您要Visual Studio列出它们)。

TARGETS := libapriltag.a libapriltag.so 
# LIBS := -Lusr/include/flycapture

在大多数情况下,您不需要。对于极少数情况,有对象库

add_library(apriltag ${APRILTAG_SRCS})
target_include_directories(apriltag PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include/apriltag)
target_compile_options(apriltag PUBLIC -fPIC -Wall -Wno-unused-parameter -Wno-unused-function -O4)

我们在此处使用BUILD_SHARED_LIBS定义库:

.PHONY: all
all: $(TARGETS)
    @$(MAKE) -C example all

static 共享之间的开关是通过clean进行的,有关CMAKE的调用。

.PHONY: install
install: libapriltag.so
    @chmod +x install.sh
    @./install.sh $(PREFIX)/lib libapriltag.so #this should be the line that install the library
    @./install.sh $(PREFIX)/include/apriltag $(APRILTAG_HEADERS)
    @sed 's:^prefix=$$:prefix=$(PREFIX):' < apriltag.pc.in > apriltag.pc
    @./install.sh $(PREFIX)/lib/pkgconfig apriltag.pc
    @rm apriltag.pc
    @ldconfig

在这里无事可做。cmake将自动创建它。

install(TARGETS apriltag
        ARCHIVE DESTINATION lib
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib)
install(DIRECTORY include/
        DESTINATION include/
        FILES_MATCHING PATTERN *.h)

cmake会以一个幅度放松:

libapriltag.a: $(APRILTAG_OBJS)
    @echo "   [$@]"
    @$(AR) -cq $@ $(APRILTAG_OBJS)
libapriltag.so: $(APRILTAG_OBJS)
    @echo "   [$@]"
    @$(CC) -fPIC -shared -o $@ $^
%.o: %.c
    @echo "   $@"
    @$(CC) -o $@ -c $< $(CFLAGS)

将安装库静态和共享库(无论存在什么)和标题文件。

.PHONY: clean
clean:
    @rm -rf *.o common/*.o $(TARGETS)
    @$(MAKE) -C example clean

不需要所有这些。

PP_20

您不需要。Cmake将自动生成TARGETS := libapriltag.a libapriltag.so目标。

APRILTAG_SRCS := $(shell ls *.c common/*.c)来判断,您绝对需要add_library命令来创建目标。

而不是使用诸如add_library之类的通配符收集souces,而是建议在clean呼叫中明确列出它们。但是,如果您真的想自动列出它们,请参见文件(Glob ...)命令。(但是,有一些重要的事情要注意,请参阅全球范围内指定源文件?)

set(CMAKE_C_FLAGS "blabla")目标将通过CMAKE自动生成。

最后,请参阅install()命令的文档以创建安装规则。

使用set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} blabla")设置编译器标志,或使用CC_19。

附加。

最新更新