当使用libgtest_main.a时,googletest给出了多个main定义,或者当没有使用libgtest_main.a时,给出了未定义的测试引用[重复]。

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

我按照这个链接中给出的步骤建立了googletest-&gt。

https:/www.eriksmistad.nogetting-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脚本编译它的方法-&gt。

  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和Include路径的样子--&gt。

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,两者都不能解决我的问题。

很抱歉我的问题这么长,但我想包括所有可能的信息。

c++ unit-testing c++11 googletest
1个回答
0
投票

原来是我遗漏了一个愚蠢的问题。 正如评论中建议的那样,我应该 在调用链接器的命令行中,将库放在对象之前。

脚本中的这个运行命令工作了--

  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
~                                                                                            
© www.soinside.com 2019 - 2024. All rights reserved.