Saya mendapatkan kesalahan ini, tetapi saya tidak tahu cara memperbaikinya.
Saya menggunakan Visual Studio 2013. Saya membuat nama solusi MyProjectTest Ini adalah struktur solusi pengujian saya:
- function.h
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H
int multiple(int x, int y);
#endif
-fungsi.cpp
#include "function.h"
int multiple(int x, int y){
return x*y;
}
- main.cpp
#include <iostream>
#include <cstdlib>
#include "function.h"
using namespace std;
int main(){
int a, b;
cin >> a >> b;
cout << multiple(a, b) << endl;
system("pause");
return 0;
}
Saya seorang pemula; ini adalah program sederhana dan berjalan tanpa kesalahan. Saya membaca di internet dan menjadi tertarik dengan pengujian unit, jadi saya membuat proyek pengujian:
File> New> Project ...> Installed> Templates> Visual C ++> Test> Native Unit Test Project>
Nama: UnitTest1 Solusi: Tambahkan ke solusi Kemudian lokasi dialihkan secara otomatis ke jalur solusi terbuka saat ini Ini adalah struktur folder dari solusi:
Saya hanya mengedit file unittest1.cpp:
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../MyProjectTest/function.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestEqual)
{
Assert::AreEqual(multiple(2, 3), 6);
// TODO: Your test code here
}
};
}
Tetapi saya mendapatkan kesalahan LNK2019: simbol eksternal yang belum terselesaikan. Saya tahu bahwa implementasi fungsi kelipatan hilang. Saya mencoba untuk menghapus file function.cpp dan saya mengganti deklarasi dengan definisi, dan itu berjalan. Namun tidak disarankan untuk menulis deklarasi dan definisi dalam file yang sama. Bagaimana cara memperbaiki kesalahan ini tanpa melakukan itu? Haruskah saya mengganti dengan #include "../MyProjectTest/function.cpp"
dalam file unittest.cpp?
(Saya tidak terlalu pandai berbahasa Inggris. Terima kasih)
sumber
.LIB
ekstensi file. Untuk memperumit hal-hal ... pustaka tautan dinamis (yaitu*.DLL
) dapat memiliki pustaka impor yang menyertai yang juga memiliki.LIB
ekstensi file. Pustaka impor ini mencantumkan semua barang yang disediakan oleh*.DLL
. Untuk informasi lebih lanjut, silakan baca: Panduan Pemula untuk LinkersJawaban:
Salah satu opsi adalah memasukkannya ke
function.cpp
dalamUnitTest1
proyek Anda , tetapi itu mungkin bukan struktur solusi yang paling ideal. Jawaban singkat untuk masalah Anda adalah ketika membangunUnitTest1
proyek Anda , compiler dan linker tidak mengetahuifunction.cpp
keberadaannya, dan juga tidak memiliki tautan apa pun yang berisi definisimultiple
. Cara untuk memperbaikinya adalah dengan menggunakan perpustakaan penautan.Karena pengujian unit Anda berada dalam proyek yang berbeda, saya berasumsi niat Anda adalah menjadikan proyek itu sebagai program pengujian unit yang berdiri sendiri. Dengan fungsi yang Anda uji terletak di proyek lain, dimungkinkan untuk membangun proyek itu ke pustaka yang terhubung secara dinamis atau statis. Library statis ditautkan ke program lain pada waktu pembuatan, dan memiliki ekstensi
.lib
, dan library dinamis ditautkan saat runtime, dan memiliki ekstensi.dll
. Untuk jawaban saya, saya lebih suka perpustakaan statis.Anda dapat mengubah program pertama Anda menjadi pustaka statis dengan mengubahnya di properti proyek. Harus ada opsi di bawah tab Umum di mana proyek diatur untuk membangun sebuah executable (
.exe
). Anda dapat mengubahnya menjadi.lib
. The.lib
File akan membangun ke tempat yang sama dengan.exe
.Dalam
UnitTest1
proyek Anda, Anda dapat membuka propertinya, dan di bawah tab Linker dalam kategori Direktori Perpustakaan Tambahan, tambahkan jalur ke manaMyProjectTest
build. Kemudian, untuk Dependensi Tambahan di bawah Linker - tab Input, tambahkan nama pustaka statis Anda, kemungkinan besarMyProjectTest.lib
.Itu akan memungkinkan proyek Anda untuk dibangun. Perhatikan bahwa dengan melakukan ini,
MyProjectTest
tidak akan menjadi program yang dapat dijalankan secara mandiri kecuali Anda mengubah properti build-nya sesuai kebutuhan, yang akan kurang dari ideal.sumber
Pada pohon solusi Visual Studio klik kanan pada proyek 'UnitTest1' lalu Add -> Existing item -> pilih file ../MyProjectTest/function.cpp
sumber
Karena saya ingin proyek saya dikompilasi ke EXE mandiri, saya menautkan proyek UnitTest ke file function.obj yang dihasilkan dari function.cpp dan berhasil. Klik kanan pada proyek 'UnitTest1'> Properti Konfigurasi> Linker> Input> Dependensi Tambahan> tambahkan ".. \ MyProjectTest \ Debug \ function.obj"
sumber
Saya baru saja mengalami masalah ini di Visual Studio 2013. Ternyata sekarang, memiliki dua proyek dalam solusi yang sama dan pengaturan dependensi saja tidak cukup. Anda perlu menambahkan referensi proyek di antara mereka. Untuk melakukannya:
sumber
ternyata saya menggunakan file .c dengan file .cpp. mengganti nama .c menjadi .cpp memecahkan masalah saya.
sumber
Cara lain Anda bisa mendapatkan kesalahan linker ini (seperti yang saya lakukan) adalah jika Anda mengekspor instance kelas dari dll tetapi belum menyatakan kelas itu sendiri sebagai impor / ekspor.
Jadi meskipun terutama saya mengekspor hanya instance dari kelas Book yang disebut di
book
atas, saya harus mendeklarasikanBook
kelas sebagai kelas ekspor / impor juga jika tidak memanggilbook.WordCount()
dll lainnya menyebabkan kesalahan tautan.sumber
Ini terjadi pada saya, jadi saya pikir saya akan membagikan solusi saya, sesederhana itu:
Periksa Kumpulan Karakter dari kedua proyek di Properti Konfigurasi -> Umum -> Kumpulan Karakter
Proyek UnitTest saya menggunakan Set Karakter Multi-Byte default sementara libs saya di Unicode .
Fungsi saya menggunakan TCHAR sebagai parameter. Akibatnya di lib saya saya TCHAR itu berubah menjadi WCHAR tapi itu adalah char * di UnitTest saya: simbol yang berbeda karena parameter benar-benar tidak sama pada akhirnya.
sumber
Saya baru saja menemukan itu
LNK2019
terjadi selama kompilasi di Visual Studio 2015 jika lupa memberikan definisi untuk fungsi yang dideklarasikan di dalam kelas.Kesalahan penaut sangat samar tetapi saya mempersempit apa yang hilang dengan membaca kesalahan dan memberikan definisi di luar kelas untuk menyelesaikannya.
sumber
dalam kasus saya, setel file cpp ke "C / C ++ compiler" di properti -> secara umum selesaikan kesalahan LNK2019.
sumber
Bagi saya bekerja, jika saya menambahkan baris di bawah ini di
.vcxproj
dalamitemGroup
berkas cpp, yang terhubung ke file header.sumber
Dalam Visual Studio 2017 jika Anda ingin menguji anggota publik, cukup letakkan proyek nyata Anda dan uji proyek dalam solusi yang sama, dan tambahkan referensi ke proyek nyata Anda dalam proyek pengujian.
Lihat Pengujian Unit C ++ di Visual Studio dari blog MSDN untuk detail selengkapnya. Anda juga dapat memeriksa Write unit tests untuk C / C ++ di Visual Studio serta Gunakan Microsoft Unit Testing Framework untuk C ++ di Visual Studio , yang terakhir adalah jika Anda perlu menguji anggota non publik dan perlu melakukan pengujian dalam proyek yang sama sebagai kode asli Anda.
Perhatikan bahwa hal-hal yang ingin Anda uji perlu diekspor menggunakan
__declspec(dllexport)
. Lihat Mengekspor dari DLL Menggunakan __declspec (dllexport) untuk detail selengkapnya.sumber