【发布时间】:2019-09-06 14:01:06
【问题描述】:
根据是否使用using 指令,我在共享库中定义了不同的符号。我想知道我做错了什么/为什么这种方法不起作用。
对于这个例子,我正在从源文件util.cpp 创建一个共享库libutil.so,其中包括一个标题util.hpp。链接到libutil.so 的程序在prog.cpp 中定义。
// util.h
#pragma once
namespace util {
int func();
}
// util.cpp
#include "util.hpp"
using namespace util; // This is the directive in question
int func() { return 42; }
// prog.cpp
#include "util.hpp"
#include <iostream>
int main() {
std::cout << util::func() << std::endl;
}
这是我编译和链接所有内容的方法(在 gcc-7.3.0 上)
g++ -g -std=c++14 -fPIC -o util.o -c util.cpp
g++ -g -std=c++14 -shared -o libutil.so util.o
g++ -g -std=c++14 -o prog prog.cpp -L. -lutil
导致此错误的最后一行
/tmp/ccwaFRtS.o: In function `main':
/home/wtf/prog.cpp:5: undefined reference to `util::func()'
collect2: error: ld returned 1 exit status
但是,将 util.cpp 更改为此可以修复错误:
namespace util {
int func() { return 42; }
}
在检查符号表时,原始(损坏的)方式显示如下:
000000000000059a T _Z4funcv
而第二种方法(正确定义)显示了这一点:
000000000000059a T _ZN4util4funcEv
【问题讨论】:
-
想一想:使用(不良做法)
using方法,编译器如何知道您正在尝试定义util::func而不是::func? -
另一种选择是将func定义更改为
int util::func() { return 42; }