gpt4 book ai didi

makefile - 将Makefile转换为CMakeLists,从哪里开始

转载 作者:行者123 更新时间:2023-12-02 14:42:16 25 4
gpt4 key购买 nike

我在inet上搜索过,但没有找到明确的答案。您能为我指出如何将 Makefile 转换为 CMakeLists 的正确方向吗?

我想这样做,因为我对 makefile 和 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 和 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. 制作

  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. 制作

  3. 对我想要修改的文件进行一些修改

  4. sudo make install,它给出以下输出:

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

看来CMakeLists.txt的安装部分不正确!

文件 install.sh 如下。

#!/bin/sh -e
# Usage: install.sh TARGET [RELATIVE PATHS ...]
#
# e.g. ./install.sh /usr/local foo/file1 foo/file2 ...
# This creates the files /usr/local/foo/file1 and /usr/local/foo/file2

TARGETDIR=$1
shift

for src in "$@"; do
dest=$TARGETDIR/$src
mkdir -p $(dirname $dest)
cp $src $dest
echo $dest
done

你能帮我一下吗?谢谢

最佳答案

让我们逐步完成:

PREFIX ?= /usr/local

我们忽略它,因为它是默认的。可以被 CMAKE_INSTALL_PREFIX 覆盖。

CC = gcc
AR = ar

也忽略这些。使用CMAKE_C_COMPILERCMAKE_CXX_COMPILER强制切换编译器。

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

它们对于类似 gcc 的编译器来说非常特别。定义目标后,有条件地为 CMAKE_C_COMPILER_ID MATCHES GNU 进一步设置它们。标准由 set(C_STANDARD 98)set(CXX_STANDARD 98) 设置。

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

定义一个变量,分别列出所有源文件:set(APRILTAG_SRCS ...)

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

定义一个单独列出所有头文件的变量:set(APRILTAG_HEADERS ...)。但是,您实际上并不需要它们(除非您希望 Visual Studio 列出它们)。

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

在大多数情况下,您不需要它。对于那些罕见的情况有Object Libraries .

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

我们在这里使用add_library定义我们的库:

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)

静态和共享之间的切换是通过调用 CMake 时的 BUILD_SHARED_LIBS 完成的。

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

这里没什么可做的。 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)

这将安装库静态库和共享库(无论存在什么)以及头文件。

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

你不需要那个。 CMake 将自动生成一个 clean 目标。

关于makefile - 将Makefile转换为CMakeLists,从哪里开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40860769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com