相关疑难解决方法(0)

在linux上使用ncurses时未定义的引用

我正在尝试在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.hncurses.h.

到底是怎么回事?

c linux ncurses

10
推荐指数
3
解决办法
2万
查看次数

在编译和链接C++文件时关于-ldl标志

参考以下代码

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)

c++ linux dynamic-linking c++11

9
推荐指数
1
解决办法
9228
查看次数

静态链接ncurses到程序

我有一些问题静态地将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)

我有点困惑为什么这不起作用.我在这里错过了什么?

c compiler-construction gcc ncurses static-libraries

8
推荐指数
3
解决办法
1万
查看次数

如何在使用gnu-make链接静态库时遵循链接顺序?

我有以下问题:

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 makefile gnu-make static-linking

8
推荐指数
1
解决办法
2146
查看次数

如何检测关键函数中调用的后台函数

我正在研究非常大的c ++项目,它具有许多实时关键功能以及许多慢速后台功能.不应从时间关键函数中调用这些后台函数.那么有没有办法检测从关键函数调用的这些后台函数?编译时间会很好,但无论如何我想在这些后台函数之前检测.更多信息,慢速和关键功能都是同一类的一部分,并共享相同的标题.

更多信息,关键函数在非常快的线程(> = 10KHz)下运行较慢,在不同的较慢线程(<= 1KHz)下运行.使用慢函数中的关键部分来保护类成员变量,因为它们都使用相同的类成员变量.这就是在关键功能中调用缓慢功能的原因会降低整体系统性能.这就是我想自动找到所有这些功能而不是手动检查的原因.

谢谢....

c++

7
推荐指数
1
解决办法
271
查看次数

CMake 不链接 C 和 C++ 静态库(对函数的未定义引用)

我试图重现最小的问题。当我在 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)

功能文件 …

c c++ cmake

7
推荐指数
1
解决办法
9630
查看次数

共享库符号冲突和静态链接(在 Linux 上)

我遇到了一个问题,该问题已在一篇好文章“共享库符号冲突(在 Linux 上)”中详细阐述。问题是,当执行和.so定义了同名函数时,如果.so调用这个函数名,它会调用执行中的那个函数,而不是.so本身的这个函数。

我们来谈谈这篇文章中的案例。我了解DoLayer()中的函数在编译时layer.o具有外部函数依赖性。DoThing()layer.o

但是在编译时libconflict.so,外部函数依赖项不应该就地解析并用conflict.o/DoThing()静态地址替换吗?

为什么layer.o/DoLayer()仍然使用动态链接来查找DoThing()?这是设计好的行为吗?

linux gcc elf dynamic-linking ld

7
推荐指数
1
解决办法
3702
查看次数

如何在 CMake 中使用 `--start-group` 和 `--end-group`

是否可以使用 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到该变量中包含的所有库。)

c++ linker g++ cmake

7
推荐指数
1
解决办法
3018
查看次数

链接无法找到符号,但读取库并存在符号

我一直在努力编译我的项目而且我遇到了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)

linux g++ ld shared-objects

6
推荐指数
1
解决办法
4023
查看次数

如何在Ubuntu 14.04中使用线程构建块

我想让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)

我真的不明白为什么这种改变使编译成功.

install tbb ubuntu-14.04

6
推荐指数
0
解决办法
2万
查看次数