我使用C++(Eclipse)在Linux中工作,并希望使用库.Eclipse向我显示错误:
undefined reference to 'dlopen'
Run Code Online (Sandbox Code Playgroud)
你知道解决方案吗?
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*desk)(char*);
char *error;
handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
desk= dlsym(handle, "Apply");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
dlclose(handle);
}
Run Code Online (Sandbox Code Playgroud) 在什么情况下,GCC 在尝试调用伪造函数时不会抛出"未定义的引用"链接错误消息?
例如,GCC编译和链接此C代码的情况:
void function()
{
made_up_function_name();
return;
}
Run Code Online (Sandbox Code Playgroud)
...即使代码中made_up_function_name没有任何地方(不是标题,源文件,声明或任何第三方库).
GCC是否可以在某些条件下接受和编译这种代码,而无需触及实际代码?如果是这样,哪个?
谢谢.
编辑:之前没有任何声明或提及made_up_function_name.这意味着grep -R整个文件系统中的一个只显示完整的单行代码.
-l选项告诉链接器搜索标准目录中的库.使用-L,我们可以指定自己的库目录进行搜索.
问题:顺序顺序是否也与-L选项有关,就像-l wrt链接器一样?
这个链接:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html没有多说-L的序列.
编辑 另外,
在默认目录之前搜索命令行中指定的目录
是来自手册页(正如Dmitry指出的那样),这是否意味着即使我指定的顺序如下:
gcc -lm hello.c -Lx
Run Code Online (Sandbox Code Playgroud)
仍然首先给出用-L指定的目录?
我一直在尝试构建一些使用数学函数的代码(例如pow).
math.h包含,并-lm在构建期间使用该标志.
当像这样调用编译时(-lm命令开头的标志),它失败了,说有一个未定义的引用pow:
gcc -lm -O3 main.o clustering.o grassberger.o hash.o list.o mat.o metropolis.o motif_ids.o output.o permutation.o prob.o random.o results.o role.o stubs.o switches.o -o mfinder
main.o: In function `get_sn_motif_id':
main.c:(.text+0x28d): undefined reference to `pow'
Run Code Online (Sandbox Code Playgroud)
当-lm国旗放在命令的末尾时,它就可以了!
gcc -O3 main.o clustering.o grassberger.o hash.o list.o mat.o metropolis.o motif_ids.o output.o permutation.o prob.o random.o results.o role.o stubs.o switches.o -o mfinder -lm
Run Code Online (Sandbox Code Playgroud)
这是正常的吗?
可能重复:
为什么gcc中'-l'选项的顺序很重要?
我开始学习Boost单元测试框架.我有一个最小的测试套件:
#define BOOST_TEST_MAIN
#define BOOST_TEST_DYN_LINK
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE( test1 ) {
BOOST_CHECK( 2 == 1 );
}
Run Code Online (Sandbox Code Playgroud)
首先我编译源代码:
g++ -c src/tests.cc -o src/tests.o
Run Code Online (Sandbox Code Playgroud)
这完成没有错误.然后我可以链接如下:
g++ -o tests src/tests.o -lboost_unit_test_framework
Run Code Online (Sandbox Code Playgroud)
这也完成没有错误.生成的二进制文件执行预期结果.但是,如果我交换了src/tests.o和的顺序-lboost_unit_test_framework,我会收到链接器错误:
g++ -o tests -lboost_unit_test_framework src/tests.o
Run Code Online (Sandbox Code Playgroud)
src/tests.o: In function `main': tests.cc:(.text+0x29): undefined reference to `boost::unit_test::unit_test_main(bool (*)(), int, char**)' src/tests.o: In function `test1::test_method()': tests.cc:(.text+0x9d): undefined reference to `boost::unit_test::unit_test_log_t::set_checkpoint(boost::unit_test::basic_cstring, unsigned int, boost::unit_test::basic_cstring)' tests.cc:(.text+0x146): undefined reference to `boost::test_tools::tt_detail::check_impl(boost::test_tools::predicate_result const&, boost::unit_test::lazy_ostream const&, boost::unit_test::basic_cstring, unsigned int, boost::test_tools::tt_detail::tool_level, boost::test_tools::tt_detail::check_type, unsigned int, …
例如
啊
class Dummy {
public:
Dummy() { std::cout << "a.h" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
BH
class Dummy {
public:
Dummy() { std::cout << "b.h" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
c.cc
#include "a.h"
void test() {
Dummy a;
}
Run Code Online (Sandbox Code Playgroud)
d.cc
#include "b.h"
int main() {
Dummy a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后使用命令编译源文件
g++ d.cc c.cc
Run Code Online (Sandbox Code Playgroud)
输出是
b.h
Run Code Online (Sandbox Code Playgroud)
但是有了命令
g++ c.cc d.cc
Run Code Online (Sandbox Code Playgroud)
输出是
a.h
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么没有multiple definition错误以及为什么输出取决于编译的顺序?
我在ubuntu14.04上运行.我能够在机器上安装datastax的cpp驱动程序.
但我无法运行任何示例
Install the project...
-- Install configuration: ""
-- Up-to-date: /usr/local/include/cassandra.h
-- Up-to-date: /usr/local/lib/libcassandra.so.0.7.0
-- Up-to-date: /usr/local/lib/libcassandra.so.0
-- Up-to-date: /usr/local/lib/libcassandra.so
-- Up-to-date: /usr/local/lib/libcassandra_static.a
root@ubuntu-cassandra:~/cpp-driver# cd -
/root/cpp-driver/examples/simple
root@ubuntu-cassandra:~/cpp-driver/examples/simple# strace -s 1024 -f -e execve gcc -I /usr/local/include/ -L /usr/local/lib/ -lcassandra simple.c
execve("/usr/bin/gcc", ["gcc", "-I", "/usr/local/include/", "-L", "/usr/local/lib/", "-lcassandra", "simple.c"], [/* 23 vars */]) = 0
Process 30450 attached
[pid 30450] execve("/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1", ["/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1", "-quiet", "-I", "/usr/local/include/", "-imultiarch", "x86_64-linux-gnu", "simple.c", "-quiet", "-dumpbase", "simple.c", "-mtune=generic", "-march=x86-64", "-auxbase", "simple", "-fstack-protector", "-Wformat", "-Wformat-security", "-o", …Run Code Online (Sandbox Code Playgroud)