我现在正在使用 pciutils 库 实现一个 Linux 应用程序。我构建了存储库来通过命令
libpci.a
生成名为 make PREFIX=./local install-lib
的头文件和静态库,如自述文件所述。
构建库后,我尝试使用
g++
命令构建我的测试应用程序,但由于缺少函数定义,它无法使用该消息正确构建。我正确检查了 libpci.a
文件位于 ./pciutils/local/lib
目录,并使用 pci_alloc()
命令检查了文件定义 nm -C libpci.a
函数,但无法构建。
$ g++ test.cpp -Ipciutils/local/include/pci -Lpciutils/local/lib -lpci -lz -ludev
/usr/bin/ld: /tmp/ccYdhXrN.o: in function `main':
test.c:(.text+0xd): undefined reference to `pci_alloc()'
collect2: error: ld returned 1 exit status
但是,当我使用相同的命令尝试该命令时,除了将
g++
更改为 gcc
和
.cpp
改为.c
,编译成功并生成a.out
文件。
$ gcc test.c -Ipciutils/local/include/pci -Lpciutils/local/lib -lpci -lz -ludev
$ ls
a.out pciutils test.c test.cpp
现在我可以继续我的项目的下一步,但我想知道刚刚发生了什么。为什么gcc可以编译,g++不能?查找库并链接它们有什么区别吗?
这是我的
test.c
和test.cpp
。两个文件完全相同。
#include <stdio.h>
#include <pci.h>
int main(void)
{
struct pci_access *pacc;
pacc = pci_alloc(); /* Get the pci_access structure */
return 0;
}
C 和 C++ 是不同的语言。如果你想在C++程序中使用C头文件,你需要以C++兼容的方式制作它。通常,
extern "C"
就足够了。
#include <cstdio>
extern "C" {
#include <pci.h>
}
int main(void)
{
struct pci_access *pacc;
pacc = pci_alloc(); /* Get the pci_access structure */
}
刚刚发生了什么
不在
extern "C"
内部的函数名称是名称损坏的。研究 C++ 中的名称重整。