gcc 可以找到该库,但 g++ 不能,当指定 -l 选项时

问题描述 投票:0回答:1

我现在正在使用 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;
}
gcc linker g++
1个回答
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++ 中的名称重整。

© www.soinside.com 2019 - 2024. All rights reserved.