小编Ale*_*aev的帖子

与MinGW的静态和动态/共享链接

我想从一个简单的链接用法开始解释我的问题.让我们假设有一个库z可以编译为共享库libz.dll(D:/libs/z/shared/libz.dll)或静态库libz.a(D:/ libs/z/static/libz.一个).

让我想链接它,然后我这样做:

gcc -o main.exe main.o -LD:/libs/z/static -lz
Run Code Online (Sandbox Code Playgroud)

根据这个文档,gcc将搜索libz.a,即

归档文件,其成员是目标文件

我也可以做以下事情:

gcc -o main.exe main.o -LD:/libs/z/shared -lz
Run Code Online (Sandbox Code Playgroud)

在上面的文档中没有提到-l标志将搜索lib<name>.so.

如果我libz.a和libz.dll将在同一目录中会发生什么?图书馆如何与计划挂钩?为什么我需要标志-Wl,-Bstatic,-Wl,-Bdynamic如果-l搜索共享和静态库?

如果我编译共享库分发,为什么有些开发人员为.a文件提供相同模块的.dll文件?

例如,Qt在bin目录中提供.dll文件,其中包含lib目录中的.a文件.它是同一个库,但分别构建为共享和静态?或.a文件是某种虚拟库,提供与共享库的链接,其中有真正的库实现?

另一个例子是Windows上的OpenGL库.为什么每个编译器都必须在MingW中提供类似libopengl32.a的静态OpenGL库?

什么是.dll.a和.la扩展名用于的文件?

PS这里有很多问题,但我认为每个问题都取决于前一个问题,没有必要将它们分成几个问题.

c++ gcc mingw dynamic-linking static-linking

28
推荐指数
1
解决办法
4万
查看次数

指针指针动态二维数组

这个网站上的第一个计时器,所以这里..

我是C++的新手,我目前正在阅读"DS Malik的数据结构使用C++第二版"一书.

在书中,Malik提供了两种创建动态二维数组的方法.在第一种方法中,将变量声明为指针数组,其中每个指针都是整数类型.恩.

int *board[4];
Run Code Online (Sandbox Code Playgroud)

..然后使用for循环创建'列',同时使用指针数组作为'行'.

第二种方法,您使用指针指针.

int **board;
board = new int* [10]; 
Run Code Online (Sandbox Code Playgroud)

等等

我的问题是:哪种方法更好?**方法对我来说更容易可视化,但第一种方法可以大致相同的方式使用.两种方式都可用于制作动态二维数组.

编辑:上面的帖子不够清楚.这是我尝试过的一些代码:

int row, col;

cout << "Enter row size:";
cin >> row;
cout << "\ncol:";
cin >> col;

int *p_board[row];
for (int i=0; i < row; i++)
    p_board[i] = new int[col];

for (int i=0; i < row; i++)
{
    for (int j=0; j < col; j++)
    {
        p_board[i][j] = j;
        cout << p_board[i][j] << " ";
    }
    cout << endl;
}
cout << …
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers memory-management dynamic-arrays

26
推荐指数
2
解决办法
14万
查看次数

如何使用mingw-w64编译和链接32位Windows可执行文件

我正在使用Ubuntu 13.04并使用安装了mingw-w64 apt-get install mingw-w64.我可以使用以下命令编译和链接我的程序的64位工作版本:

x86_64-w64-mingw32-g++ code.cpp -o app.exe
Run Code Online (Sandbox Code Playgroud)

这会生成一个64位的app.exe文件.

我使用什么二进制或命令行标志来生成32位版本的app.exe?

linux 32-bit mingw 32bit-64bit mingw-w64

24
推荐指数
1
解决办法
2万
查看次数

在Windows上铿锵

首先,我遵循了"入门:构建和运行Clang".特别是,我根据"使用Visual Studio"部分构建了它.换句话说,我使用Visual Studio 2010构建它.

其次,我手动设置MinGW发行版的包含和库路径:

在此输入图像描述

我正在尝试编译的简单程序:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我从编译器得到以下反馈:

In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ostream:39:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\ios:38:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\iosfwd:41:
In file included from C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\bits/postypes.h:41:
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:144:11: error: no member named 'fgetws' in the global namespace
  using ::fgetws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:146:11: error: no member named 'fputws' in the global namespace
  using ::fputws;
        ~~^
C:\MinGW\lib\gcc\mingw32\4.5.2\include\c++\cwchar:150:11: error: no …
Run Code Online (Sandbox Code Playgroud)

c++ windows mingw llvm clang

23
推荐指数
1
解决办法
4万
查看次数

Win-builds与MinGW-builds之间的区别

有谁知道Win-buildsMinGW-builds之间的区别?我对Windows的C++ 11(14)编译器非常感兴趣,但遗憾的是MSVC尚未完全符合C++ 11标准.

c++ windows gcc mingw c++11

22
推荐指数
1
解决办法
1万
查看次数

Vim:在Windows下的终端中编码(Unicode)

我不知道为什么,但是这个话题似乎记录不清,并且充满争议,因为没有人知道真正的答案(除了Moolenaar先生,他很少回答).

所以基本上我已经在这里提出了一个讨论,它很快就死了,可能是因为在Windows上没有太多人在终端模式下使用Vim.

我的编码设置如下:

if has('multi_byte')
  if empty(&termencoding)
    let &termencoding = &encoding
  endif
  let &encoding     = 'utf-8'
  let &fileencoding = 'utf-8'
endif
Run Code Online (Sandbox Code Playgroud)

当然,我在GVim下运行没有问题:可以输入任何字符,而我Consolas对Powerline的补丁工作得很好.当我尝试在终端模式下运行Vim时,问题就出现了.我使用ConEmu,一个功能丰富的Windows终端模拟器.它声称正式支持Unicode开箱即用.例如,我可以运行以下测试脚本:

chcp 65001 & (cmd /c type "%~dpn0.cmd") & pause & goto :EOF

English:     texts, web pages and documents
Graves,etc:  à á â ã ä å æ ç è é ê ë ì í î ï
Greek:       ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? …
Run Code Online (Sandbox Code Playgroud)

windows unicode vim terminal winapi

21
推荐指数
1
解决办法
6222
查看次数

调整Java套接字的性能

我已经创建了一个远程桌面控制应用程序.显然,它由客户端和服务器部分组成:

服务器:

  • 从客户端接收鼠标/键盘操作;
  • 将桌面的屏幕截图发送给客户端.

客户:

  • 从服务器接收屏幕截图;
  • 发送鼠标/键盘动作;

考虑发送屏幕截图.当我使用家用PC作为服务器时 - 我最终获得了1920x1080的屏幕截图尺寸.通过使用JAI Image I/O Tools并将其编码为PNG,我能够为这样一个大图像获得以下统计数据:

  1. 写入时间~0.2秒; (不是插入套接字,而是进入某些"常规"输出流,即编码时间)
  2. 读取时间~0.05 s; (不是来自套接字,而是来自某些"常规"输入流,即解码时间)
  3. 大小~250 KB;
  4. 完美的品质.

因此,根据#1 - 理想的可能FPS应为~5.

不幸的是,我甚至无法达到~5 FPS,甚至不能达到2 FPS.我搜索了瓶颈,发现对套接字I/O流的写入/读取需要大约2秒(参见附录1和2以进行说明).当然这是不可接受的.

我对这个主题进行了一些研究 - 并在两侧增加了套接字I/O流(带BufferedInputStreamBufferedOutputStream)的缓冲.我从64 KB大小开始.这确实提高了性能.但仍然不能拥有至少2个FPS!另外,我已经尝试了Socket#setReceiveBufferSize并且Socket#setSendBufferSize速度有一些变化,但我不知道它们的行为究竟如何,因此我不知道使用哪些值.

看初始化代码:

服务器:

    ServerSocket serverSocket = new ServerSocket();
    serverSocket.setReceiveBufferSize( ? ); // #1
    serverSocket.bind(new InetSocketAddress(...));

    Socket clientSocket = serverSocket.accept();
    clientSocket.setSendBufferSize( ? ); // #2
    clientSocket.setReceiveBufferSize( ? ); // #3

    OutputStream outputStream = …
Run Code Online (Sandbox Code Playgroud)

java sockets performance networking

18
推荐指数
2
解决办法
3万
查看次数

对运营商'delete'的调用是否同步?

我想知道对运营商的呼叫delete是否同步.换句话说,如果我这样做:

delete p;
Run Code Online (Sandbox Code Playgroud)

C++标准是否保证只有在此调用完成执行后才释放内存?或者是调用是异步的,并且只要它决定最好的时间,它就会安排OS的任务释放这个内存吗?

如果第一种情况是有效的,那么它是否意味着我们必须实现我们自己的异步删除工具?我问,因为我会说大多数时候我们(程序员)不关心内存是否完全释放,因此我们不希望我们的代码冻结并等待这个(最有可能是昂贵的?)系统调用完成,而是安排删除任务并立即继续执行.C++是否提供任何标准功能(可能通过标准库?)来完成此操作而无需重新发明轮子?

c++ asynchronous memory-management

18
推荐指数
2
解决办法
1236
查看次数

Git'预先接收'钩子和'git-clang-format'脚本可以可靠地拒绝违反代码样式约定的推送

让我们立刻从pre-receive我已经写过的一个钩子开始:

#!/bin/sh
##
  format_bold='\033[1m'
   format_red='\033[31m'
format_yellow='\033[33m'
format_normal='\033[0m'
##
  format_error="${format_bold}${format_red}%s${format_normal}"
format_warning="${format_bold}${format_yellow}%s${format_normal}"
##
stdout() {
  format="${1}"
  shift
  printf "${format}" "${@}"
}
##
stderr() {
  stdout "${@}" 1>&2
}
##
output() {
  format="${1}"
  shift
  stdout "${format}\n" "${@}"
}
##
error() {
  format="${1}"
  shift
  stderr "${format_error}: ${format}\n" 'error' "${@}"
}
##
warning() {
  format="${1}"
  shift
  stdout "${format_warning}: ${format}\n" 'warning' "${@}"
}
##
die() {
  error "${@}"
  exit 1
}
##
git() {
  command git --no-pager "${@}"
}
##
list() {
  git rev-list …
Run Code Online (Sandbox Code Playgroud)

git sh githooks git-daemon clang-format

11
推荐指数
1
解决办法
1820
查看次数

Pimpl + QSharedPointer - 析构函数=灾难

昨天我遇到了痛苦,让我感到沮丧24小时.问题归结为随机发生的意外崩溃.更复杂的是,调试报告也具有绝对随机的模式.更复杂的是,所有调试跟踪都会导致随机 Qt源或本机DLL,即证明每次问题都不在我身边.

这里有几个这样可爱的报告的例子:

Program received signal SIGSEGV, Segmentation fault.
0x0000000077864324 in ntdll!RtlAppendStringToString () from C:\Windows\system32\ntdll.dll
(gdb) bt
#0 0x0000000077864324 in ntdll!RtlAppendStringToString () from C:\Windows\system32\ntdll.dll
#1 0x000000002efc0230 in ?? ()
#2 0x0000000002070005 in ?? ()
#3 0x000000002efc0000 in ?? ()
#4 0x000000007787969f in ntdll!RtlIsValidHandle () from C:\Windows\system32\ntdll.dll
#5 0x0000000000000000 in ?? ()
Run Code Online (Sandbox Code Playgroud)
warning: HEAP: Free Heap block 307e5950 modified at 307e59c0 after it was freed
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000000778bf0b2 in ntdll!ExpInterlockedPopEntrySListFault16 () from …
Run Code Online (Sandbox Code Playgroud)

c++ qt destructor pimpl-idiom qsharedpointer

8
推荐指数
1
解决办法
1772
查看次数