我正在尝试在Linux上使用ncurses开始开发程序.我甚至无法编译Hello World示例.这是代码:
#include <curses.h>
int main()
{
initscr();
printw("Hello, world.");
refresh();
getch();
endwin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我得到:
hello.c:(.text+0x12): undefined reference to `initscr'
Run Code Online (Sandbox Code Playgroud)
对于那些被称为函数的每一个.
我通过apt-get安装了ncurses,还通过下载源代码并编译,安装等.
我已经试过#include这两个curses.h和ncurses.h.
到底是怎么回事?
参考以下代码
test_linker.cpp
int main() {
srand(time(0));
for (int i = 0; i < 10; ++i) {
cout << rand() % 10 << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
urandom.cpp
#include <iostream>
using std::cout;
using std::endl;
#include <dlfcn.h>
int rand() throw() {
// get the original rand() function
static auto original_rand = (decltype(&rand)) dlsym(RTLD_NEXT,"rand");
cout << "Call made to rand()" << endl;
return original_rand();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下命令编译代码时
g++ -std=c++11 -Wall -Werror -Wextra -Wvla -pedantic -O3 urandom.cpp -c
g++ -std=c++11 -Wall -O3 test_linker.cpp urandom.o …Run Code Online (Sandbox Code Playgroud) 我有一些问题静态地将ncurses链接到我的一个程序
这是一个非常简单的示例程序:
#include<ncurses.h>
int main(){
initscr();
printw("Hello world\n");
refresh();
getch();
endwin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我用它编译它
gcc -static -lncurses hello_curses.c -o curses
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
/tmp/ccwHJ6o1.o: In function `main':
curses_hello.c:(.text+0x5): undefined reference to `initscr'
curses_hello.c:(.text+0x14): undefined reference to `printw'
curses_hello.c:(.text+0x1b): undefined reference to `stdscr'
curses_hello.c:(.text+0x20): undefined reference to `wrefresh'
curses_hello.c:(.text+0x27): undefined reference to `stdscr'
curses_hello.c:(.text+0x2c): undefined reference to `wgetch'
curses_hello.c:(.text+0x31): undefined reference to `endwin'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我有点困惑为什么这不起作用.我在这里错过了什么?
我有以下问题:
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG build/liblcthw.a tests/list_tests.c -o tests/list_tests
/tmp/ccpvGjZp.o: In function `test_create':
~/lcthw/tests/list_tests.c:12: undefined reference to `List_create'
collect2: ld returned 1 exit status
make: *** [tests/list_tests] Error 1
Run Code Online (Sandbox Code Playgroud)
但
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/list_tests.c build/liblcthw.a -o tests/list_tests
Run Code Online (Sandbox Code Playgroud)
运行得很好,nm显示预期的内容,测试运行,每个人都很开心,等等.
我搜索了SO并找到了很多答案(例如链接器命令 - GCC),所以很明显链接器的工作原理应该如此.那么,我应该如何修改我的makefile以遵循命令呢?
到目前为止,这是Makefile:
CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
LIBS=$(OPTLIBS)
PREFIX?=/usr/local
BUILD=build
SOURCES=$(wildcard src/**/*.c src/*.c)
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))
TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(patsubst %.c,%,$(TEST_SRC))
TARGET=$(BUILD)/liblcthw.a
TARGET_LINK=lcthw
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))
#The …Run Code Online (Sandbox Code Playgroud) 我正在研究非常大的c ++项目,它具有许多实时关键功能以及许多慢速后台功能.不应从时间关键函数中调用这些后台函数.那么有没有办法检测从关键函数调用的这些后台函数?编译时间会很好,但无论如何我想在这些后台函数之前检测.更多信息,慢速和关键功能都是同一类的一部分,并共享相同的标题.
更多信息,关键函数在非常快的线程(> = 10KHz)下运行较慢,在不同的较慢线程(<= 1KHz)下运行.使用慢函数中的关键部分来保护类成员变量,因为它们都使用相同的类成员变量.这就是在关键功能中调用缓慢功能的原因会降低整体系统性能.这就是我想自动找到所有这些功能而不是手动检查的原因.
谢谢....
我试图重现最小的问题。当我在 Ubuntu 上运行 CMake+Make 时出现错误
funccpp.cpp:(.text+0x5): undefined reference to `FuncC'
即在 C++ 库中导入时找不到 C 库中的导出函数。当我尝试使用g++ main.cpp funcc.c funccpp.cpp它手动编译时,成功编译了最终程序。如何解决 CMake 问题?
作为参考,当我运行时,nm libfuncc_lib.a我得到线T FuncC(所以符号是外部的并在文本部分中定义),当我运行时nm libfunccpp_lib.a我得到U FuncC(所以符号是未定义的,应该从外部链接)。
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Test C CXX)
set (SRC_CPP funccpp.cpp)
set (SRC_C funcc.c)
set (SRC_MAIN main.cpp)
add_library(funcc_lib STATIC ${SRC_C})
add_library(funccpp_lib STATIC ${SRC_CPP})
add_executable(prog ${SRC_MAIN})
target_link_libraries(prog funcc_lib funccpp_lib)
Run Code Online (Sandbox Code Playgroud)
主程序
#include "funccpp.h"
int main() {
FuncCPP();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
功能文件
#ifndef FUNCCPP_H
#define FUNCCPP_H
void FuncCPP();
#endif
Run Code Online (Sandbox Code Playgroud)
功能文件 …
我遇到了一个问题,该问题已在一篇好文章“共享库符号冲突(在 Linux 上)”中详细阐述。问题是,当执行和.so定义了同名函数时,如果.so调用这个函数名,它会调用执行中的那个函数,而不是.so本身的这个函数。
我们来谈谈这篇文章中的案例。我了解DoLayer()中的函数在编译时layer.o具有外部函数依赖性。DoThing()layer.o
但是在编译时libconflict.so,外部函数依赖项不应该就地解析并用conflict.o/DoThing()静态地址替换吗?
为什么layer.o/DoLayer()仍然使用动态链接来查找DoThing()?这是设计好的行为吗?
是否可以使用 CMake 将目标的库包含在--start-group/中--end-group,而无需手动将参数字符串写入target_link_options?
背景:将 C++ 可执行文件链接到库列表(使用 g++ 7.5.0)时,我遇到库排序问题。我最近了解了gcc/g++ 中的--start-group和--end-group选项,这些选项允许重复搜索档案。我想在使用 CMake 生成构建文件时启用这些选项。
给定目标库名称列表(例如target_link_libraries(myTarget mylibrary1 mylibrary2 ${MY_VARIABLE_LIST_OF_LIBRARIES} ...)),是否可以将所有这些库包含在--start-group/中--end-group,而不必像中那样手动键入参数target_link_options(myTarget PUBLIC "--start-group -lmylibrary1 -lmylibrary2 ... --end-group")?(我特别希望避免必须追踪内容${MY_VARIABLE_LIST_OF_LIBRARIES}"以手动添加-l到该变量中包含的所有库。)
我一直在努力编译我的项目而且我遇到了undefined reference错误.例如.:
installertest.cpp:(.text+0x9d1): undefined reference to `XmlRpcValue::makeArray()'
...
installertest.cpp:(.text+0xede): undefined reference to `dbcancel'
installertest.cpp:(.text+0xefd): undefined reference to `dbfcmd'
installertest.cpp:(.text+0xf0f): undefined reference to `dbsqlexec'
installertest.cpp:(.text+0xf2d): undefined reference to `SHA1_Init'
...
Run Code Online (Sandbox Code Playgroud)
我的命令行是:
g++ -o installertest \
-lsybdb \
-lxmlrpc \
-lxmlrpc_cpp \
-lxmlrpc_xmlparse \
-lxmlrpc_xmltok \
-lxmlrpc_util \
-lxmlrpc++ \
-lxmlrpc_server_cgi \
-lssl \
-std=c++0x \
ContractData.o installertest.o
Run Code Online (Sandbox Code Playgroud)
objdump -T显示符号位于.so文件中.例如.:
libsybdb.so:
...
0000000000011c30 g DF .text 0000000000000083 Base dbcancel
...
/usr/lib/libxmlrpc_cpp.so:
...
0000000000002e78 g DF .text 0000000000000092 Base _ZN11XmlRpcValue9makeArrayEv …Run Code Online (Sandbox Code Playgroud) 我想让TBB工作,但是我在编译Ubuntu 14.04时遇到了一些困难.我认为为编译器设置库的位置可能存在问题.
我使用以下命令安装TBB:
sudo apt-get install libtbb-dev
Run Code Online (Sandbox Code Playgroud)
我有一个小测试示例,我现在正在尝试编译.代码如下:
#include "tbb/task_scheduler_init.h"
int main(int argc, char* argv[]) {
tbb::task_scheduler_init init;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在运行的编译此代码的命令如下:
g++ -std=c++11 -g -O2 -ltbb simple_test.cc -o simple_test
Run Code Online (Sandbox Code Playgroud)
我用G ++版本4.9.1运行它.当我尝试编译时,我收到以下错误:
/tmp/cc7Ls8Sb.o: In function `task_scheduler_init':
/usr/include/tbb/task_scheduler_init.h:126: undefined reference to `tbb::task_scheduler_init::initialize(int, unsigned long)'
/tmp/cc7Ls8Sb.o: In function `~task_scheduler_init':
/usr/include/tbb/task_scheduler_init.h:132: undefined reference to `tbb::task_scheduler_init::terminate()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
文件的位置task_scheduler_init.h是/usr/include/tbb/task_scheduler_init.h.
你知道我做错了什么吗?
编辑:我重新排序了g ++的论据,这使它工作:
g++ simple_test.cc -std=c++11 -g -O2 -ltbb -o simple_test
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么这种改变使编译成功.