提问人:Alexander123456 提问时间:4/2/2022 最后编辑:Alexander123456 更新时间:4/7/2022 访问量:129
mariadb-connector-cpp-1.0.1:cjportedtests.exe 的链接错误
mariadb-connector-cpp-1.0.1: Linking error for cjportedtests.exe
问:
环境
- 视窗 10
- MinGW-W64 x86_64-ucrt-posix-she, 11.2.0
- CMake 版本 3.19.5
错误提示如下:
[ 74%]链接 CXX 可执行文件。\cjportedtests.exe
c:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe:C:/Libraries/mariadb/lib/libtest_framework.a(test_asserts.cpp.obj):在函数 __imp__ZN3sqlneERKNS_9SQLStringEPKc' 中
collect2.exe:错误:ld 返回 1 退出状态
make[2]: *** [test\CJUnitTestsPort\CMakeFiles\CJUnitTestsPort.dir\build.make:347: test/cjportedtests.exe] 错误 1
make[1]: *** [CMakeFiles\Makefile2:411: test/CJUnitTestsPort/CMakeFiles/CJUnitTestsPort.dir/all] 错误 2
make: *** [makefile:124: all] 错误 2testsuite::assertEquals(sql::SQLString const&, char const*, char const*, int)': D:/Daten/Installation/Coding/mariadb/mariadb-connector-cpp-1.0.1-src/test/framework/test_asserts.cpp:298: undefined reference to
评论
在第 298 行产生错误的文件(标记为注释)
测试/框架/test_asserts.cpp
void assertEquals(const sql::SQLString& expected, const char* result
, const char* file, int line)
{
if (expected != result) // line 298. error here
{
std::stringstream errmsg;
errmsg.str("");
errmsg << "assertEquals(std::string) failed in" << file << ", line #" << line;
errmsg << " expecting '" << expected << "' got '" << result << "'";
TestsListener::testHasFailed(errmsg.str());
}
}
sql::SQLString 在 src/SQLString.cpp 中定义,我认为它应该是 libmariadbcpp.dll.a 库的一部分。但是,修改测试/CJUnitTestsPort/CMakeLists.txt 包括
SET(MY_TARGET_LINK_LIBRARIES ${LIBRARY_NAME} C:/Libraries/mariadb/lib/libmariadbcpp.dll.a test_framework)
它会产生相同的错误。
我执行了 构建/测试/driver_test.exe 构建/测试/static_test.exe 并且没有错误。
问题
为什么链接器在这里找不到引用?
对原始 src/cmake 文件进行更改,使其在 mingw 上运行:
在单个文件中进行多次更改时,行号表示之前更改后的行号(从上到下)
- 删除 libmariadb 子文件夹
- 在 CMakeLists.txt 注释掉行: 524,525
- [src/CArrayImp.h:59-63] 替换为 #define ZEROI64 0LL
- [src/CArray.cpp] 注释行 25-28
- [测试/test_common.cpp:40-42] 替换为 #include < inttypes.h>
- [测试/test_common.cpp:99-113] 替换为
- #define L64(x) x##LL
- #define UL64(x) x##ULL
- [test/ccppTypes.h:41-49] 替换为 #include < string.h>
- [test/ccppTypes.h:64-78] 替换为
- #define L64(x) x##LL
- #define UL64(x) x##ULL
- [test/unit/unit_fixture.cpp:37-43] 替换为 #define L64(x) x##LL
- CMAKE_CXX_FLAGS -IC:/directory/for/mariadb-connector_c/include -LC:/directory/for/mariadb-connector_c/lib
- CMAKE_C_FLAGS -IC:/directory/for/mariadb-connector_c/include -LC:/directory/for/mariadb-connector_c/lib
- CMAKE_CXX_FLAGS_STANDARD_LIBRARIES添加了 -lsecur32 -lcrypt32 C:/path/to/ShLwApi.Lib
编辑以响应评论
SQLString.cpp
在 test_asserts.cpp 中定义用例的 != 运算符:
bool operator!=(const SQLString& str1, const char* str2)
{
return str1.compare(0, str1.length(), str2, strlen(str2)) != 0;
}
bool operator!=(const char* str1, const SQLString& str2)
{
return str2.compare(0, str2.length(), str1, strlen(str1)) != 0;
}
溶液
已在 github.com 上发出了拉取请求(这些更改将来可能会变得不合时宜)
- [test/CJUnitTestsPort/CMakeLists.txt:35,41] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/CMakeLists.txt:31] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/example/CMakeLists.txt:48] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/classes/CMakeLists.txt:46,66,87,107,127,147,167,208] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/performance/CMakeLists.txt:45] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/bugs/CMakeLists.txt:45] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
答:
根据劳林·诺维茨基(Lawrin Novitsky)的评论,解决问题的方法是链接的顺序。对问题进行了编辑,以包括解决方案。
溶液
已在 github.com 上发出了拉取请求(这些更改将来可能会变得不合时宜)
- [test/CJUnitTestsPort/CMakeLists.txt:35,41] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/CMakeLists.txt:31] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/example/CMakeLists.txt:48] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/classes/CMakeLists.txt:46,66,87,107,127,147,167,208] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/performance/CMakeLists.txt:45] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
- [test/unit/bugs/CMakeLists.txt:45] test_framework后更改链接到 ${LIBRARY_NAME} 的顺序
评论