gpt4 book ai didi

c++ - 为什么链接器在库中找不到一个(存在的)方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:49 24 4
gpt4 key购买 nike

所以我最近开始使用一个名为 libgambatte ( github ) 的库,一切都很顺利,直到链接器开始提示某个方法的引用未定义。真正奇怪的是它为该对象找到所有其他方法!参数的类型是正确的(我从库中包含的工作程序中复制了它们)。

代码如下:

制作输出:

g++  -Wall -Wextra -g3 -I../libgambatte/include -I../common  -c -o test.o test.cpp
g++ test.o -L../libgambatte -lgambatte -lz -o test
test.o: In function `main':
<REDACTED>/src/test.cpp:12: undefined reference to `gambatte::GB::runFor(unsigned long*, long, unsigned long*, unsigned long&)'
collect2: error: ld returned 1 exit status
Makefile:9: recipe for target 'test' failed
make: *** [test] Error 1

生成文件:

CPPFLAGS=-Wall -Wextra -g3 -I../libgambatte/include -I../common
LDFLAGS=-L../libgambatte -lgambatte -lz

.PHONY=all clean

all: test

test: test.o
$(CXX) test.o $(LDFLAGS) -o test

clean:
rm -f test.o test

nm ../libgambatte/libgambatte.a 的输出 | grep runFor:

0000000000007a20 T _ZN8gambatte3CPU6runForEm
0000000000000190 T _ZN8gambatte2GB6runForEPjlS1_Rm
U _ZN8gambatte3CPU6runForEm

test.cpp 的来源:

#include <gambatte.h>

using namespace std;

int main(void){
gambatte::uint_least32_t audiobuf[1234];
gambatte::uint_least32_t framebuf[1234];
size_t samples = 1234;
unsigned gb_width = 160;
gambatte::GB gb;

gb.runFor(framebuf, gb_width, audiobuf, samples);

return 0;
}

runFor方法声明:

std::ptrdiff_t runFor(gambatte::uint_least32_t *videoBuf, std::ptrdiff_t pitch,
gambatte::uint_least32_t *audioBuf, std::size_t &samples);

gambatte::uint_least32_t 的定义:

#ifdef HAVE_CSTDINT

#include <cstdint>

namespace gambatte {
using std::uint_least32_t;
using std::uint_least16_t;
}

#elif defined(HAVE_STDINT_H)

#include <stdint.h>

namespace gambatte {
using ::uint_least32_t;
using ::uint_least16_t;
}

#else

namespace gambatte {
#ifdef CHAR_LEAST_32
typedef unsigned char uint_least32_t;
#elif defined(SHORT_LEAST_32)
typedef unsigned short uint_least32_t;
#elif defined(INT_LEAST_32)
typedef unsigned uint_least32_t;
#else
typedef unsigned long uint_least32_t;
#endif

#ifdef CHAR_LEAST_16
typedef unsigned char uint_least16_t;
#else
typedef unsigned short uint_least16_t;
#endif
}
#endif

抱歉代码太长。

最佳答案

我发现了问题:正如您在 gambatte::uint_least32_t 的定义中看到的那样,类型定义是基于某些常量的存在。我的问题是因为库(和包含的程序)是用 -DHAVE_STDINT_H 编译的,因此将 gambatte::uint_least32_t 定义为不同的类型,导致链接器找不到正确的签名;使用 -DHAVE_STDINT_H 编译为我解决了这个问题。

关于c++ - 为什么链接器在库中找不到一个(存在的)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33746810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com