你认真的样子真可爱003

您所在的位置:网站首页 makefile打印变量 你认真的样子真可爱003

你认真的样子真可爱003

2023-04-11 02:31| 来源: 网络整理| 查看: 265

问题:如何忽略在c文件中include中明确的头文件路径?

在 C 语言的源文件中,如果 #include 的头文件包含有路径,编译器会在指定的路径中搜索该头文件,如果找不到则会编译错误。但有些情况下,我们希望忽略掉路径的影响,只在系统默认的头文件搜索路径中寻找头文件。这时可以使用 < 和 > 符号来代替双引号来引用头文件。例如:

#include

使用 < 和 > 符号的头文件搜索路径有系统默认路径和环境变量 C_INCLUDE_PATH 所包含的路径。如果在这些路径中找不到头文件,编译器就会报错。

需要注意的是,使用 < 和 > 符号引用头文件时,不应包含路径信息。如果需要包含路径信息,应该使用双引号 " 符号引用头文件,并在头文件路径前添加 -I 选项指定路径。

问题:c文件中include的头文件包含有路径怎么办?

当 C 语言的源文件中 #include 的头文件包含有路径时,可以通过-I选项来指定需要包含的头文件路径。

在 Makefile 中设置CFLAGS变量时,可以使用-I选项来指定头文件搜索路径。以下是一个示例 Makefile,其中包含了一个头文件路径include/:

CC=gcc CFLAGS=-Wall -Iinclude/ TARGET=my_program $(TARGET): main.o foo.o bar.o $(CC) $(CFLAGS) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(TARGET) *.o

在 Makefile 中的规则中,使用 $(CFLAGS) 这个变量包括所有的编译选项,其中包含了要包含的头文件路径-Iinclude/。

这种方法可以让编译器搜索指定的头文件路径,找到需要的头文件。但需要注意,如果头文件路径被错误指定了,编译器可能会无法找到头文件,从而导致编译失败。因此,在设置头文件路径时,需要确认路径的正确性。

问题:makefile中如何忽略c文件中包含的头文件路径?

可以使用 make 隐含规则中的 CFLAGS 变量来忽略编译时的包含路径(包括头文件路径)。

在 Makefile 中设置 CFLAGS 变量时,可以使用 -iquote 或 -isystem 选项以指定需要忽略的头文件路径。其中,-iquote 和 -isystem 的区别在于,前者忽略的头文件路径会被搜索两次,而后者只搜索一次。所以,如果需要忽略一些系统头文件路径的话,建议使用-isystem。

以下是一个示例 Makefile,其中忽略了头文件路径 /usr/include:

CC=gcc CFLAGS=-Wall -isystem /usr/include TARGET=my_program $(TARGET): main.o foo.o bar.o $(CC) $(CFLAGS) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(TARGET) *.o

在 Makefile 中的规则中,使用 $(CFLAGS) 这个变量包括所有的编译选项,其中包含了要忽略的头文件路径 -isystem /usr/include。

这种方法可以让编译器忽略掉某些头文件路径,不进行搜索。但需要注意,这可能会导致编译失败或运行时错误。所以,应该谨慎使用该方法,只在必要的情况下使用。

问题:cmake中如何将APP_HEADER_DIR文件夹及子文件夹中所有的h文件复制到APP_H_DIR文件夹中?

你可以使用cmake的file(GLOB_RECURSE)命令来获取APP_HEADER_DIR文件夹及其子文件夹中的所有头文件,然后使用file(COPY)命令将这些头文件复制到APP_H_DIR文件夹中。以下是示例CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.0) project(MyProject) set(APP_HEADER_DIR "path/to/header/dir") set(APP_H_DIR "path/to/h/dir") file(GLOB_RECURSE APP_HEADERS ${APP_HEADER_DIR}/*.h) file(COPY ${APP_HEADERS} DESTINATION ${APP_H_DIR})

具体来说,file(GLOB_RECURSE APP_HEADERS ${APP_HEADER_DIR}/*.h)会获取APP_HEADER_DIR文件夹及其子文件夹中所有的.h文件,存储到名为APP_HEADERS的列表中。然后,file(COPY ${APP_HEADERS} DESTINATION ${APP_H_DIR})将这些.h文件复制到指定的APP_H_DIR文件夹中。

需要注意的是,使用GLOB和GLOB_RECURSE获取文件列表是不推荐的做法,因为它们在CMake中的行为并不像人们期望的那样。更推荐的方法是通过手动列出所有源文件来显式地定义源文件集。但是,在实际应用中,这种方法更方便,因此可以根据自己的实际情况选择使用。

问题:makefile对目录长度有要求吗?

通常来说,makefile对目录长度没有硬性要求,因为makefile本身并不会直接操作文件系统。但是,在使用makefile时,会涉及到文件的读取、编译、链接等操作,如果文件的完整路径长度过长,可能会导致一些问题,例如:

系统限制:在Windows系统中,文件路径不能超过260个字符;在Linux系统中,文件路径的最大长度是4096字节。如果路径过长,系统可能无法正确处理。

编译错误:如果路径过长,可能会导致编译器无法正确识别文件,从而产生错误。

因此,在使用makefile时,建议尽可能使用短路径和简短的文件名,以避免这些问题的出现。

问题:makefile报错:make (e=206): 文件名或扩展名太长。如何解决?

这个错误通常是因为路径太长导致。你可以尝试以下方法解决此问题:

使用短路径:将你的工作目录移动到一个位置较短的路径下,比如c:/mywork。

更改文件夹名称:如果你正在使用的文件夹名称太长,可以尝试将它更改为更短的名称。

使用短文件名:在Windows中,每个文件夹和文件都有一个短文件名。你可以通过在命令提示符中运行"dir /x"命令查看它们。使用短文件名可以缩短路径长度,但可能会使代码更难阅读。

使用UNC路径:使用UNC路径而不是本地驱动器字母可以解决此问题。例如,使用//servername/sharename/path/to/file而不是C:/path/to/file。

缩短文件名或文件路径:将文件名或文件路径更改为更短的名称。

问题:makefile如何对include目录进行递归查找?

在Makefile中可以使用 -I 参数来指定头文件的搜索路径,其中加入 -I 开关可以使得搜索路径递归进行查找。

例如,在Makefile中添加:

CPPFLAGS := -I./include

就可以使得编译器在查找头文件时,从当前目录下的 include 目录中进行递归查找。如果你的项目中有多个头文件所在目录,可以在-I 参数后添加多个目录路径,用空格隔开即可,例如:

CPPFLAGS := -I./include -I./lib/include

这样,编译器就会从当前目录下的 include 和 lib/include 目录中递归查找头文件。

当然,如果你希望完全掌控头文件的查找过程,也可以通过自定义变量或者函数来实现。例如,以下是一个递归查找头文件的示例:

# 查找路径 VPATH := ./src ./include ./lib # 自定义函数,递归查找头文件 define search_header $(firstword $(wildcard $(foreach d,$(VPATH),$d/$(1)))) \ $(firstword $(wildcard $(foreach d,$(VPATH),$d/*/$1))) \ $(firstword $(wildcard $(foreach d,$(VPATH),$d/*/*/$1))) \ $(firstword $(wildcard $(foreach d,$(VPATH),$d/*/*/*/$1))) endef # 链接规则 main: main.o $(call search_header, foo.h) $(call search_header, bar.h) gcc main.o -o main # 编译规则 %.o: %.c $(call search_header, $*.h) gcc -c $(CPPFLAGS) $(CFLAGS) $< -o $@

以上的 Makefile 文件中定义了一个自定义函数 search_header,来递归查找头文件。使用方式为 $(call search_header, header_file.h),其中 header_file.h 为需要查找的头文件名。此外,使用 VPATH 变量来指定头文件的搜索路径。

问题:cmake中如何给HEADINC增加一个路径?

在 CMake 中,可以使用 include_directories() 函数来添加一个或多个包含文件的路径。具体来说,可以使用以下语法将路径添加到 HEADINC 变量:

include_directories(${HEADINC} /path/to/directory)

其中,${HEADINC} 是 HEADINC 变量的当前值,/path/to/directory 是要添加的新路径。通过这种方式,可以在不覆盖原有路径的情况下向 HEADINC 变量添加新的路径。

需要注意的是,include_directories() 函数添加的路径将适用于整个项目,包括所有的目标文件。如果要仅在特定的目标中添加路径,可以使用 target_include_directories() 函数。例如:

target_include_directories(my_target PRIVATE /path/to/directory)

这会将 /path/to/directory 添加到 my_target 目标文件的包含路径中,而不会影响其他目标文件。

问题:如何让cmake在编译时不输出包含路径?

在 CMake 中,可以通过设置编译器的选项来禁止输出包含路径。具体而言,可以使用CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS 变量来设置编译器选项。在这些变量中添加 -Wno-include-what-you-use 选项即可禁止输出包含路径。例如:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-include-what-you-use") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-include-what-you-use")

这会将编译器选项 -Wno-include-what-you-use 添加到 C 和 C++ 的编译选项中,从而禁止输出包含路径。

需要注意的是,禁止输出包含路径可能会使得代码调试变得更加困难。因此,如果在调试时需要查看包含路径,应该及时注释或删除上述命令。此外,-Wno-include-what-you-use 选项在不同的编译器中的行为可能存在差异,建议在特定的编译器中进行测试和验证。

问题:如何让hightec编译器在编译时不输出包含路径?

在 hightec 编译器中,可以通过设置编译器选项 -fno-show-included-files 来禁止输出包含路径的信息。该选项会禁止在编译时输出包含文件的路径信息。在 CMake 中,可以通过设置 CMAKE_C_FLAGS 和 CMAKE_CXX_FLAGS 变量来设置编译器选项。

例如,在 CMake 中,可以在 CMakeLists.txt 文件中添加以下命令来设置编译器选项:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-show-included-files") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-show-included-files")

这会将 -fno-show-included-files 编译器选项添加到 C 编译器和 C++ 编译器的编译选项中,从而禁止输出包含路径的信息。

需要注意的是,以上命令只会在使用 hightec 编译器时起作用,对于其他编译器可能需要使用不同的选项。同时,禁止输出包含路径的信息可能会使得代码调试变得更加困难,因此应该在必要的情况下使用。

问题:cmake如何将INCLUDE_DIRS中的“/”换成""?

在 CMake 中,可以使用 STRING(REPLACE ) 命令将字符串中的所有匹配内容替换为指定的替换字符串,并将其写入到指定的输出变量中。

因此,可以使用以下命令将 INCLUDE_DIRS 中的所有 "/" 替换为 "":

STRING(REPLACE "/" "\\" INCLUDE_DIRS_WIN ${INCLUDE_DIRS})

此命令会将处理后的字符串存储在 INCLUDE_DIRS_WIN 变量中,即将 / 替换为 \ 的结果。接下来,你可以将 INCLUDE_DIRS_WIN 变量用于你的项目中。

需要注意的是,在 Windows 系统上,路径分隔符为 "",而不是 "/",因此在编写 CMakeLists.txt 文件时,需要确保使用正确的路径分隔符。

问题:cmake中用哪个变量代表当前所有目录?

在 CMake 中,可以使用 ${CMAKE_CURRENT_LIST_DIR} 变量代表当前 CMakeLists.txt 文件所在的目录。该变量包含当前 CMake 源文件所在的路径,因此可以通过 ${CMAKE_CURRENT_LIST_DIR}/ 访问该目录下的子目录或文件。同时,${CMAKE_CURRENT_LIST_FILE}变量代表当前 CMake 源文件的完整路径,即包括文件名的路径。例如,${CMAKE_CURRENT_LIST_FILE}可以用于生成自定义编译器的自定义命令,并将输出保存在与源文件相同的目录中:add_custom_command(TARGET mytarget COMMAND mycompiler ARGS ${CMAKE_CURRENT_LIST_FILE} -o ${CMAKE_CURRENT_LIST_DIR}/output)。

问题:cmake如何使用GLOB_RECURSE在APP_HEADER_DIR中获取相对路径?

可以按照以下方式使用 GLOB_RECURSE 在 APP_HEADER_DIR 中获取头文件的相对路径:

set(APP_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") file(GLOB_RECURSE APP_HEADERS "${APP_HEADER_DIR}/*.hpp" "${APP_HEADER_DIR}/*.h" ) foreach(header ${APP_HEADERS}) file(RELATIVE_PATH relative_header ${APP_HEADER_DIR} ${header}) list(APPEND RELATIVE_HEADERS ${relative_header}) endforeach() # 输出所有头文件的相对路径 message("Relative header files:") foreach(relative_header ${RELATIVE_HEADERS}) message(" ${relative_header}") endforeach()

首先设置了头文件目录 APP_HEADER_DIR。然后使用 file 命令和 GLOB_RECURSE 选项查找所有扩展名为 .hpp 和 .h 的头文件,并存储在 APP_HEADERS 变量中。接着,使用 file(RELATIVE_PATH ...) 函数将这些头文件相对于 APP_HEADER_DIR 目录的相对路径转换为相对路径,并存储在 RELATIVE_HEADERS 变量中。最后,我们输出所有头文件的相对路径信息。

问题:cmake如何使用GLOB_RECURSE获取相对路径?

在 CMake 中,也可以使用 GLOB_RECURSE 命令获取相对路径。

以下是一个使用 GLOB_RECURSE 获取相对路径的示例 CMakeLists.txt:

# 设置搜索的文件夹 set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") # 使用 GLOB_RECURSE 获取所有源文件的相对路径 file(GLOB_RECURSE SRCS "${SRC_DIR}/*.cpp" "${SRC_DIR}/*.c") foreach(src ${SRCS}) file(RELATIVE_PATH relSrc ${SRC_DIR} ${src}) list(APPEND RELATIVE_SRCS ${relSrc}) endforeach() # 输出所有源文件的相对路径 message("Relative source files:") foreach(relSrc ${RELATIVE_SRCS}) message(" ${relSrc}") endforeach() # 添加可执行目标,将返回的相对路径传递给编译器 add_executable(myapp ${RELATIVE_SRCS})

在这个示例中,我们先使用 set 命令设置了搜索的文件夹。使用 file 命令和 GLOB_RECURSE 选项,查找所有扩展名为 .cpp 和 .c 的源文件,并存储在 SRCS 变量中。接下来,使用 file(RELATIVE_PATH ...) 函数将这些文件的相对路径相对于 SRC_DIR 目录转换为相对路径,并存储在 RELATIVE_SRCS 变量中。最后,我们输出所有相对路径信息,并将返回的相对路径传递给 add_executable 命令,以生成可执行目标。

问题:如何使用GLOB_RECURSE获取相对路径?

GLOB_RECURSE 命令可以递归地搜索指定的文件夹下的所有文件,可以使用它来获取相对路径。以下是一个使用 GLOB_RECURSE 获取相对路径的示例 Makefile:

# 设置搜索的文件夹 SRC_DIR := src # 使用 GLOB_RECURSE 获取所有源文件的相对路径 SRCS := $(shell find $(SRC_DIR) -name '*.cpp' -or -name '*.c') RELATIVE_SRCS := $(patsubst $(SRC_DIR)/%, %, $(SRCS)) # 编译目标 all: $(RELATIVE_SRCS) $(CXX) $(CPPFLAGS) -o main $(RELATIVE_SRCS) # 打印所有的源文件相对路径 list: @echo $(RELATIVE_SRCS)

此 Makefile 定义了一个 SRC_DIR 变量,以确定要搜索的文件夹。使用 GLOB_RECURSE 命令和 find 工具,查找所有扩展名为 .cpp 和 .c 的源文件,并存储在 SRCS 变量中。接下来,使用 patsubst 函数将这些文件的相对路径相对于 $(SRC_DIR) 目录转换为相对路径,并存储在 RELATIVE_SRCS 变量中。最后,在 all 目标中,将 $(RELATIVE_SRCS) 变量传递给编译器,用于编译源文件,生成目标文件。可以使用 make list 命令来打印所有源文件的相对路径。

问题:如何将需要包含的路径存在一个文件dir_includePath中,然后将这个文件传递给makefile?

可以将需要包含的路径列表存在一个文件 dir_includePath 中,然后在 Makefile 中读取该文件中的内容并传递给 -I 选项,从而将这些路径添加到编译器的头文件搜索路径中。可以使用以下代码在 Makefile 中实现此功能:

# 读取文件中的路径列表并传递给 -I 选项 INCLUDE_PATHS=$(shell cat dir_includePath | tr '\n' ' ' | sed 's/\s*$$/\n/') CPPFLAGS+= $(INCLUDE_PATHS:%=-I%) # 编译目标 all: $(CXX) $(CPPFLAGS) -o main main.cpp

这段代码首先使用 cat 命令读取 dir_includePath 文件中的内容,然后使用 tr 命令将其中的换行符替换为空格,最后使用 sed 命令去除末尾的空格并添加回换行符,得到一个空格分隔的路径列表。然后将该路径列表添加到 CPPFLAGS 变量中,并将其传递给编译器的 -I 选项,从而将这些路径添加到编译器的头文件搜索路径中。最后编译目标时使用 $(CXX) 命令编译 main.cpp 文件,并附加 CPPFLAGS 变量中的选项。

问题:可以将需要包含的路径存在一个文件dir_includePath中,然后传给makefile吗?

可以的。你可以在 CMakeLists.txt 文件中使用 file() 命令读取 dir_includePath 文件中的路径列表,再传递给 include_directories() 命令中。

假设 dir_includePath 文件的路径为 ${CMAKE_CURRENT_SOURCE_DIR}/dir_includePath,则可以使用以下代码来读取文件中的路径列表并传递给 Makefile:

# 读取文件中的路径列表 file(READ ${CMAKE_CURRENT_SOURCE_DIR}/dir_includePath DIR_INCLUDE_PATH_CONTENT) # 将内容转换成一个列表 string(REPLACE "\n" ";" DIR_INCLUDE_PATH_LIST "${DIR_INCLUDE_PATH_CONTENT}") # 将列表传递给 include_directories() 命令 include_directories(${DIR_INCLUDE_PATH_LIST})

这段代码将会将 dir_includePath 文件中每行以分号间隔的路径列表读取到 DIR_INCLUDE_PATH_LIST 列表变量中,并将其传递给 include_directories() 命令中,这样这些路径就会被添加到 Makefile 中的 INCLUDE_DIRECTORIES 编译器选项中。

问题:可以将需要包含的路径存在一个文件中,然后通过include_directories传给makefile吗?

可以的。在 CMake 中,可以使用 file() 命令读取文件中的路径列表,然后使用 include_directories() 命令将路径传递给 Makefile。

具体实现步骤如下:

在一个文件中存放需要包含的路径列表,比如

path_list.txt,每行一个路径;

在 CMakeLists.txt 文件中使用

file() 命令读取该文件中的路径列表,生成一个字符串变量

INCLUDE_PATHS,内容包含了所有路径,用分号分隔;

使用

include_directories() 命令将

INCLUDE_PATHS 变量传递给 Makefile。

下面是示例代码:

# 读取 path_list.txt 文件中的路径列表 file(STRINGS "path_list.txt" PATH_LIST) # 生成字符串变量 INCLUDE_PATHS,内容为所有路径,用分号分隔 string(REPLACE "\n" ";" INCLUDE_PATHS "${PATH_LIST}") # 将 INCLUDE_PATHS 变量传递给 Makefile include_directories(${INCLUDE_PATHS})

上述代码将读取 path_list.txt 文件中的路径列表,生成一个包含所有路径的字符串变量 INCLUDE_PATHS,并将其传递给 Makefile。可以将其放在 CMakeLists.txt 文件的顶部。

问题:REMOVE_ITEM是什么意思?

REMOVE_ITEM 是 CMake 中的一个列表操作命令,用于从列表中删除指定的项。其语法如下:

list(REMOVE_ITEM [ ...])

其中, 是要操作的列表变量名, 是要删除的元素值。可以指定多个 ,表示同时删除多个元素。

使用示例:

假设有一个列表变量 fruits,其中存储了若干种水果的名称:

set(fruits "apple" "banana" "orange" "pear")

如果现在要删除 banana 和 orange 这两种水果,可以使用 REMOVE_ITEM 命令:

list(REMOVE_ITEM fruits "banana" "orange")

执行该命令后,列表变量 fruits 的值将变为:

"apple" "pear"

注意,如果指定的元素值在列表中不存在,REMOVE_ITEM 不会产生任何效果,并且也不会报错。

问题:list(REMOVE_ITEM HEADER_DIRS ${HEADER_DIR})是什么意思?

这条命令的作用是从列表 HEADER_DIRS 中移除值为 ${HEADER_DIR} 的项。

具体来说,${HEADER_DIR} 是一个变量,它存储了一个要删除的文件夹路径。而 HEADER_DIRS 是一个列表,其中存储了多个文件夹路径,包括 ${HEADER_DIR}。list(REMOVE_ITEM) 命令的语法为:

list(REMOVE_ITEM [ ...])

这里 是要被修改的列表, 是要被移除的项,可以有多个值。在此命令中,HEADER_DIRS 是待修改的列表,${HEADER_DIR} 是要被删除的项。

因此,运行这条命令后,列表 HEADER_DIRS 中值为 ${HEADER_DIR} 的项将被移除。

问题:如何利用GLOB_RECURSE获取APP_HEADER_DIR文件夹内所有子文件夹路径而不是文件路径?

为了获取 APP_HEADER_DIR 文件夹内所有子文件夹的路径,您可以使用以下代码:

# 设置头文件目录 set(APP_HEADER_DIR /path/to/header/directory) # 获取所有子文件夹路径 file(GLOB_RECURSE HEADER_DIRS LIST_DIRECTORIES true ${APP_HEADER_DIR}/*/) # 打印目录路径 message("Header directories: ${HEADER_DIRS}")

代码解释:

首先,通过

set 命令将

APP_HEADER_DIR 变量设置为头文件目录的路径。

接着,使用

file(GLOB_RECURSE) 命令获取所有符合

${APP_HEADER_DIR}/*/ 模式的路径,其中

LIST_DIRECTORIES 参数设置为

true。该参数表示

file(GLOB_RECURSE) 命令不仅返回文件路径,还返回文件夹路径。获取到的所有子文件夹路径都将保存在

HEADER_DIRS 变量中。

最后,使用

message 命令输出

HEADER_DIRS 变量中的文件夹路径。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3