Tag: 链接器

外部内联函数会发生什么?

如果我在.h文件中定义我的函数会发生什么 extern int returnaint(void); ,在相关的.c文件中定义它 inline int returnaint(void) { return 1; } 并在另一个.c文件中包含标题并使用该函数? 当我单独编译事物,为每个.c文件创建一个目标文件然后链接它们时,是否包含内联函数,或者会发生什么? 我知道编译器可以忽略inline ,但是如果它在这种情况下不忽略它呢?

使用特定链接器进行CMake交叉编译不会将参数传递给armlink

我正在尝试交叉编译嵌入式ARM Cortex构建的项目,但我无法使链接器工作。 我想使用armlink,但没有文件传递给armlink,因此没有生成.elf文件。 我的CMakeLists.txt非常简单,如下所示。 之后显示失败,表明makefile在没有任何参数的情况下调用了armlink。 任何指针都会有所帮助 – 我搜索并阅读了很多post,但他们似乎都有更多的参与要求。 cmake_minimum_required(VERSION 2.8) project(test_arm) enable_language(C ASM) # Cross-compilation for ARM SET(CMAKE_C_COMPILER armcc) SET(CMAKE_LINKER armlink) SET(CMAKE_C_LINK_EXECUTABLE armlink) SET(CMAKE_C_FLAGS “–cpu=Cortex-M3”) SET(LINK_FLAGS “–map –ro-base=0x0 –rw-base=0x0008000 –first=’boot.o(RESET)’ –datacompressor=off”) SET(CMAKE_EXE_LINKER_FLAGS “–map –ro-base=0x0 –rw-base=0x0008000 –first=’boot.o(RESET)’ –datacompressor=off”) include_directories(../include) add_executable(blinky blinky.c) set_target_properties(blinky PROPERTIES LINKER_LANGUAGE C) 失败如下,但我想对于我的CMakeLists中有一些愚蠢问题的人来说很明显: $ make VERBOSE=1 [100%] Building C object CMakeFiles/blinky.dir/blinky.co /usr/bin/cmake -E […]

未定义的引用`initscr’ncurses

我正在尝试编译我的项目,我使用lib ncurse。 编译器链接文件时我遇到了一些错误。 这是我在Makefile中的标志行: -W -Wall -Werror -Wextra -lncurses 我已经包含了ncurses.h 一些布局: prompt$> dpkg -S curses.h libslang2-dev:amd64: /usr/include/slcurses.h libncurses5-dev: /usr/include/ncurses.h libncurses5-dev: /usr/include/curses.h prompt$> dpkg -L libncurses5-dev | grep .so /usr/lib/x86_64-linux-gnu/libncurses.so /usr/lib/x86_64-linux-gnu/libcurses.so /usr/lib/x86_64-linux-gnu/libmenu.so /usr/lib/x86_64-linux-gnu/libform.so /usr/lib/x86_64-linux-gnu/libpanel.s 这是我的错误: gcc -W -Wall -Werror -Wextra -I./Includes/. -lncurses -o Sources/NCurses/ncurses_init.o -c Sources/NCurses/ncurses_init.c ./Sources/NCurses/ncurses_init.o: In function `ncruses_destroy’: ncurses_init.c:(.text+0x5): undefined reference to `endwin’ ./Sources/NCurses/ncurses_init.o: […]

关于C ++中名称修改的问题

我正在尝试学习和理解C ++中的名称修改。 以下是一些问题: (1)来自devx 当全局函数被重载时,为每个重载版本生成的受损名称是唯一的。 名称修改也适用于变量。 因此,局部变量和具有相同用户给定名称的全局变量仍然会获得明显的错位名称。 除了重载函数和同名全局变量和局部变量之外,还有其他使用名称修改的示例吗? (2)来自Wiki 需要出现这样的情况:语言允许使用相同的标识符命名不同的实体,只要它们占用不同的命名空间(其中命名空间通常由模块,类或显式命名空间指令定义)。 我不太明白为什么名称修改仅适用于标识符属于不同名称空间的情况,因为重载函数可以在同一名称空间中,同名全局变量和局部变量也可以在同一空间中。 怎么理解这个? 具有相同名称但在不同范围内的变量是否也使用名称修改? (3)C是否有名称错误? 如果没有,那么当一些全局和局部变量具有相同名称时,它如何处理? C没有重载function,对吧? 感谢致敬!

如何与GCC进行弱连接工作?

似乎有3种方式告诉GCC弱连接符号: __attribute__((weak_import)) __attribute__((weak)) #pragma weak symbol_name 这些都不适合我: #pragma weak asdf extern void asdf(void) __attribute__((weak_import, weak)); … { if(asdf != NULL) asdf(); } 我总是得到这样的链接错误: 未定义的符号: “_asdf”,引自: _asdf $ non_lazy_ptr在ccFA05kN.o中 ld:找不到符号 collect2:ld返回1退出状态 我在OS X 10.5.5上使用GCC 4.0.1。 我究竟做错了什么?