2010-11-09 30 views
24

Bunun neden çalışmadığını anlayamıyorum. Her üç dosyamı da koyacağım ve muhtemelen birisi bana bu hatayı neden attığını söyleyebilir. Programı derlemek için g ++ kullanıyorum.C++ tanımlanmış işleve tanımsız başvuru

Programı:

#include <iostream> 
#include "h8.h" 

using namespace std; 

int main() 
{ 
    char sentence[MAX_SENTENCE_LENGTH]; 
    char writeTo[] = "output.txt"; 
    int distanceTo,likePosition, length, numWords; 
    cout << "ENTER A SENTENCE! "; 
    cin.getline(sentence, 299); 
    length = strlen(sentence); 
    numWords = wordCount(sentence, length); 
    for(int x = 0; x < 3; ++x) 
    { 
    likePosition = likePos(numWords); 
    distanceTo = lengthTo(sentence, likePosition, length); 
    insertLike(sentence, distanceTo, length, writeTo); 
    } 
    return 0; 
} 

Fonksiyon dosyası:

void insertLike(const char sentence[], const int lengthTo, const int length, char writeTo[]) 
{ 
    char part1[MAX_SENTENCE_LENGTH], part2[MAX_SENTENCE_LENGTH]; 
    char like[] = " like "; 
    for(int y = 0; y < lengthTo; ++y) 
    part1[y] = sentence[y]; 
    for(int z = lengthTo+1; z < length - lengthTo; ++z) 
    part2[z] = sentence[z]; 
    strcat(part1, like); 
    strcat(part1, part2); 
    writeToFile(sentence, writeTo); 
    return; 
} 

Başlık dosyası:

void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]); 

hata aynen edilir:

undefined reference to 'insertLike(char const*, int, int, char const*)' 
collect2: ld returned 1 exit status 

cevap

18

beyanı ve insertLike tanımını farklı Üstbilginiz dosyasında

: WriteTo [] karakter

void insertLike(const char sentence[], const int lengthTo, const int length,const );

'İşlev dosyanızda':

void insertLike(const char sentence[], const int lengthTo, const int length,karakter WriteTo []);

C++ sürece bunlar farklı değişken olduğu gibi, aynı isimde birden fazla işlev/yöntemlere sahip olabilir işlevlerin farklı, izin verir. Bağımsız değişken türleri, işlevin imzasının bir parçasıdır. dördüncü parametre olarak char * alır dördüncü parametre olarak const char* alır Bu durumda

, insertLike ve insertLikefarklı işlevler bulunmaktadır.

+0

'a göre, g ++ * .c 'bile bile tamamen/headfloor yapıyorum. şimdi. – Mashew

+21

Bazen sadece ekstra göz küreleri alır, dostum. :) C'yi ne zaman öğrendiğimi hatırlıyorum ve yarım günlüğümü klavyede hayal kırıklığıyla becermeye harcadım, o zaman kayınpederim eve gelip omzumun üzerine gelin, "Bir noktalı virgül eksik Orada." >.> – Mud

+6

Hiç kayınpederim olmadı. Muhtemelen neden yarım günden fazla zamanımı hayal kırıklığı içinde kafamı klavyeye vurdum :-) –

14

Sen derlemek ve bağlantı için gereken tüm kaynak dosyalarını birlikte:

g++ main.c function_file.c 
+2

Bunun neredeyse 5 yaşında olduğunu anlıyorum, ama ben toplam C++ acemi ve bu benim için çalıştı. Teşekkür ederim. –

+1

Aynı burada, bir Debian makinesinde bazı VS kodunu derlemeye çalışıyordum ve bunu buldum, cevap için teşekkürler! Http://stackoverflow.com/questions/3202136/using-g-to-compile-multiple-cpp-and-h-files#comment3301067_3202161 –

18

Önceki posterler belirli bir hatayı karşılamasa da, derleyicinin C bağlantısı kullanmasını söylemezseniz, g + + ile C kodunu derlemeye çalışırken 'Tanımsız başvuru' bağlayıcı hataları alabilirsiniz.

Örneğin C başlık dosyalarında yapmalısınız:

extern "C" { 

... 

void myfunc(int param); 

... 

} 

C++ programlarında mevcut 'MyFunc' yapmak için. bir C derleyicisi kullanırken hala da C bu kullanmak istiyorsanız

,

#ifdef __cplusplus 
extern "C" { 
#endif 

Bu yolu gibi, #ifdef __cplusplus önişlemci Koşullamalar extern "C" { ve } sarın extern blok sadece olacak “atlanan” .

+0

Teşekkürler, bu beni deli etmekten alıkoydu. Son anda! – Robert

+0

Linker gerçekten bu durumu kontrol etmeli ve tanımlanmış fonksiyonun unmangled versiyonunun olduğunu söylemelidir! – jtbr

+0

Teşekkürler, bu benim için çözdü. onlar başvurulan beri #Ifdef __cplusplus extern "C" benim C başlık dosyalarının üstünde ve altındaki #endif { __cplusplus ve #ifdef #endif}: Ben de eklemek için gerekli hem C++ hem de C kodu ile. – karora

2

Bu, CMake kullanıyorsanız da oluşabilir.Yeni bir sınıf oluşturduysanız ve bunu başlatmak istiyorsanız, yapıcı çağrısı sırasında, bu hata - cpp dosyaları - CMakeLists.txt değiştirmediyseniz, bu hatayı almanız gerekir. CMake, yeni bir sınıf oluşturmak her zaman, birlikte

o kafayla kullanmadan önce, (Qt gibi ui dosya) cpp dosya ve diğer herhangi derlenebilir dosyalar CMakeLists.txt eklenir ve daha sonra yeniden çalıştırmak gerekir CMakeLists.txt saklanır cmake . . Bu CMakeLists.txt dosyada Örneğin

:

cmake_minimum_required(VERSION 2.8.11) 

project(yourProject) 

file(GLOB ImageFeatureDetector_SRC *.h *.cpp) 

### Add your new files here ### 
add_executable(yourProject YourNewClass.h YourNewClass.cpp otherNewFile.ui}) 

target_link_libraries(imagefeaturedetector ${SomeLibs}) 

komutunu file(GLOB yourProject_SRC *.h *.cpp) kullanıyorsanız o zaman sadece CMakeLists.txt değiştirmeden cmake . yeniden çalıştırmak gerekir.

+0

'make rebuild_cache', yeniden yapılandırmayı zorlamak için başka bir yoldur. Ayrıca, bu nedenle CMakeLists'inizi "GLOB" dosya adından çıkarmıyorsunuz. Sonuçta CMake ** Listeleri ** olarak adlandırılan bir sebep var. – ulidtko

İlgili konular