c++ - googletest 在使用 libgtest_main.a 时给出多个主要定义,或者在不使用 libgtest_main.a 时给出未定义的测试参考
问题描述
我按照此链接中给出的步骤构建了 googletest ->
https://www.eriksmistad.no/getting-started-with-google-test-on-ubuntu/
这是我的代码
1 #include <iostream>
2 #include <vector>
3 #include "gtest.h"
4 //#include <gtest.h>
5
6 using namespace std;
7
8 void expectEqual(int n1, int n2){
9 if(n1 != n2){
10 cerr << "Actual value is " << n1 << ", expected " << n2 <<endl;
11 }
12 }
13
14 int binarySearch(vector <int> &arr, int key){
15
16 int low = 0;
17 int high = arr.size() -1 ;
18 while(low <= high){
19 int mid = (low + high) / 2;
20 if(arr[mid] == key){
21 return mid;
22 } else if (arr[mid] < key){
23 low = mid + 1;
24 }
25 else {
26 high = mid - 1;
27 }
28
29 }
58
59 TEST(BinarySearchTest, EmptyVectorTest) {
60 vector<int> arr;
61 arr.push_back(5);
62 expectEqual(binarySearch(arr, 10), -1);
63 }
64
65
66 /*int main() {
67
68 basicTest();
69 smallVectorTest();
70 emptyVectorTest();
71 return 0;
72 }*/
73
74 int main(int argc, char **argv){
75 ::testing::InitGoogleTest(&argc, argv);
76 return RUN_ALL_TESTS();
77 }
78
这就是我使用 bash 脚本编译它的方式 ->
1 #!/bin/bash
2
3 INC_DIR=/usr/include/gtest/
4 LIB_DIR=/usr/lib/
5
6 #g++ -std=c++11 -isystem $INC_DIR -pthread -L$LIB_DIR -lgtest -lgtest_main binarySearch.cpp
#gives multiple definition of `main'; error
7 #g++ -std=c++11 -isystem $INC_DIR -pthread $LIB_DIR/libgtest.a binarySearch.cpp
#gives undefined reference to `testing::InitGoogleTest(int*, char**)'
8 g++ -std=c++11 -isystem $INC_DIR -pthread $LIB_DIR/libgtest_main.a binarySearch.cpp
#gives multiple definition of `main'; error
作为参考,我还粘贴了 LIB 和包含路径的外观 -->
storm@storm:~/cpp_ut$ ls /usr/lib/
X11 gnupg
accountsservice gnupg2
apparmor gold-ld
apt groff
bfd-plugins hdparm
binfmt.d init
bolt initcpio
byobu initramfs-tools
cloud-init kernel
cnf-update-db klibc
command-not-found klibc-xcgdUApi-P9SoPhW_fi5gXfvWpw.so
compat-ld language-selector
console-setup libDeployPkg.so.0
cpp libDeployPkg.so.0.0.0
cryptsetup libdmmp.so
dbus-1.0 libdmmp.so.0.2.0
dpkg libgtest.a
dracut libgtest_main.a
storm@storm:~/cpp_ut$ ls /usr/include/gtest/
gtest-death-test.h gtest-message.h gtest-printers.h gtest-test-part.h gtest.h gtest_prod.h
gtest-matchers.h gtest-param-test.h gtest-spi.h gtest-typed-test.h gtest_pred_impl.h internal
我在 StackOverflow 上找到的类似问题的每个答案都建议我使用 libgtest.a 或 libgtest_main.a。两者都不能解决我的问题。
对于这个冗长的问题,我深表歉意,但我想包括所有可能的信息。
解决方案
事实证明,我错过了一个愚蠢的问题。正如评论中所建议的那样,我不应该将库放在调用链接器的命令行上的对象之前。
脚本中的这个运行命令有效 -
1 #!/bin/bash
2
3 INC_DIR=/usr/include/gtest/
4 LIB_DIR=/usr/lib/
5
6 #g++ -std=c++11 -isystem $INC_DIR -pthread -L$LIB_DIR -lgtest -lgtest_main binarySearch.cpp
7 #g++ -std=c++11 -isystem $INC_DIR -pthread $LIB_DIR/libgtest.a binarySearch.cpp
8 g++ -std=c++11 -isystem $INC_DIR -pthread binarySearch.cpp $LIB_DIR/libgtest.a
~
推荐阅读
- c# - C# - 防止图片框离开边界
- javascript - 所以我试图使用for循环从数组中获取一组项目并将它们显示到上下文菜单子菜单中,但不知何故我无法
- sql - 比较逗号分隔值和逗号分隔值 SQL
- python - 如何在csv_file中显示数据一字一格而不是一字一格?
- jdbc - 当新记录插入或更新数据库表中的现有记录时,如何 Hazelcast jet JDBC 继续源获取数据?
- java - 使用 Jackson 将 Java8 LocalDateTime 序列化为 UTC 时间戳
- swift - 编写一个返回自身的 Swift 函数
- javascript - 无法设置未定义的属性“道具”
- apache-camel - 用骆驼创建报告
- r - 随机选择ggtheme