ورود

View Full Version : سوال: دریافت ارور لینک LNK2019 هنگام ساخت یک برنامه



feri88
شنبه 02 بهمن 1389, 21:01 عصر
سلام

من یه برنامه دارم که از طریق سوکت UDP یه سری پیغام رو از یه process دیگه گوش می ده و در یک فایل می نویسه.
برای استفاده از توابع سوکت، از یه سورس فایل (اوپن سورس) به اسم practical socket استفاده کردم.

حالا مشکلم توی لینک کردن این دو تا برنامه به هم در محیط visual studio 2008 هست!

اول اومدم یه پروژه از نوع static library درست کردم و هدر و سورس فایل مربوطه (practicalsocket.cpp و practicalsocket.h) رو بهش اضافه کردم و کتابخونه practicalsocket.lib درست شد.
بعد یه پروژه ی دیگه درست کردم و همون برنامه اصلی رو که از توابع کتابخونه practicalsocket.lib استفاده می کنه رو بهش اضافه کردم و کامپایل کردم.
ارور مربوط به توابع کتابخونه رو داد که اومدم توی بخش linker/input/additional dependencies اسم practicalsocket.lib رو اضافه کردم
و هم چنین توی Tools/Options/VC++ Directories/Library files و linker/general/additional library directories مسیر کتابخونه practicalsocket.lib رو اضافه کردم.
در ضمن هدر فایل practicalsocket.h رو هم که قبلاً در برنامه اصلی ام include کرده بودم.

بعد از این کارها وقتی برنامه ام رو کامپایل کردم، 22 تا ارور لینک به صورت زیر رو میده:


error LNK2019: unresolved external symbol _socket@12 referenced in function

که علتش لینک نکردن به کتابخونه practicalsocket.lib هست!!
ولی من که توی additional dependency اون رو اضافه کردم!!
بعدش جفت برنامه ها رو توی یه پروژه کامپایل کردم و هزار و یک راه دیگه و هم چنین حالت های release و debug رو امتحان کردم، ولی هم چنان این 22 تا ارور لینک باقیه!
واقعا دیگه نمی دونم چی کار کنم و کجا رو اشتباه کردم؟

من سورس فایل ها رو اینجا می ذارم و می خواستم ازتون خواهش کنم اون ها رو کامپایل کنید تا این فایل exe تولید بشه و من راحت بشم و اگه ممکنه روند کامپایلش رو هم بفرمایید تا ببینم اشکالم کجا بوده؟

پیشاپیش ازتون تشکر می کنم.

این سورس برنامه ی خودم:


#include"PracticalSocket.h"
#include<string>
#include<iostream>
FILE *fd = NULL;
int main(int argc, char** argv)
{
fd = fopen("log1.txt", "w");
unsignedshort port = 10000;
try
{
UDPSocket socket(port);
for (;;) // forever...
{
char recvLogMsg[500];
std::string fromAddr;
unsignedshort fromPort;
int lenMsg = socket.recvFrom(recvLogMsg, sizeof(recvLogMsg) - 1, fromAddr, fromPort);
if (lenMsg > 0)
{
recvLogMsg[lenMsg] = '\0';

if(fd != NULL)
{
fprintf(fd, recvLogMsg);
fflush(fd);
}
}
elseif (lenMsg < 0)
{
printf("Error in receiving message log!");
}
}
}
catch (SocketException& se)
{
std::cerr << se.what() << std::endl;
return -1;
}
}

اینجا هم سورس و هدر فایل practicalsocket هست:

http://cs.ecs.baylor.edu/~donahoo/practical/CSockets/practical/

mehdi.mousavi
پنج شنبه 14 بهمن 1389, 00:22 صبح
سلام.
من فایل CPP و H مربوطه رو نگاه کردم. بالای فایل CPP این Code Block وجود داره:


#ifdef WIN32
#include <winsock.h> // For socket(), connect(), send(), and recv()
typedef int socklen_t;
typedef char raw_type; // Type used for raw data on this platform
#else
#include <sys/types.h> // For data types
#include <sys/socket.h> // For socket(), connect(), send(), and recv()
#include <netdb.h> // For gethostbyname()
#include <arpa/inet.h> // For inet_addr()
#include <unistd.h> // For close()
#include <netinet/in.h> // For sockaddr_in
typedef void raw_type; // Type used for raw data on this platform
#endif


از اونجاییکه در برنامه شما Win32 تعریف شده، پس بخش اول ifdef اجرا میشه و در نتیجه این کد:


#include <winsock.h>

این یعنی چی؟ یعنی میخواد از WinSock استفاده کنه. WinSock کجا تعریف شده؟ در کتابخونه ws2_32.lib... به بیان دیگه، کافیه این lib رو نیز به لیست lib های پروژه خودتون اضافه کنید تا اون 22 خطا از بین بره.

موفق باشید.